Почему MasterName всегда пусто в OnActionExecuted? - PullRequest
0 голосов
/ 23 апреля 2010

Я пытаюсь изменить главную страницу для всех моих страниц aspx. По какой-то причине я не могу определить, когда эта функция вызывается для страницы ascx. Любая помощь в исправлении этого будет принята с благодарностью.

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    var action = filterContext.Result as ViewResult;
    if (action != null && action.MasterName != "" && Request.IsAjaxRequest())
    {
        action.MasterName = "Ajax";
    }
    base.OnActionExecuted(filterContext);
}

Ответы [ 2 ]

1 голос
/ 24 апреля 2010

Если вы все еще хотите изменить главную страницу, основываясь на том факте, что ваш запрос - Ajax или нет - я просто случайно наткнулся на то, что вы искали:

http://devlicio.us/blogs/sergio_pereira/archive/2008/12/05/reusing-views-in-asp-net-mvc-for-ajax-updates.aspx

По сути, вместо переопределения метода OnActionExecuting в BaseController - переопределите метод View!Вы получаете именно то, что хотите, с помощью метода, который кажется специально разработанным для этого:)

protected override ViewResult View(string viewName, string masterName, object model)
{
    return base.View(viewName, Request.IsAjaxRequest() ? "Empty" : masterName, model);
}
0 голосов
/ 23 апреля 2010

То есть, вы говорите, что MasterPage пуст, когда вы выполняете действия для .ascx "страниц"?

.ascx - это не страницы, а UserControls / PartialViews. И поэтому у них нет главных страниц. Их можно удалить в маге или на главной странице. Но если ваш запрос возвращает .ascx, он не будет иметь главной страницы ..)

UPD: Скорее всего, это связано с тем, как работает MVC - все 3 части (M-V-C) полностью независимы. Это означает, что когда ваш код выполняется внутри контроллера, мы вообще ничего не знаем о представлении. И именно View выбирает главную страницу, а не контроллер.

Tbh, если вы пытаетесь изменить внешний вид приложения (изменить главную страницу) внутри контроллера - вы, скорее всего, делаете что-то не так. Во-первых, он был разработан с разделением контекста, и вы пытаетесь обойти это:)

UPD2: Итак, вы говорите, что хотите вернуть полную страницу + главную страницу для обычных запросов и просто страницу без мастера (ну, по крайней мере, очистить) для запросов ajax? Вы все еще пробуете неправильный подход.

Вот что я делал вместо этого:

if (!Request.IsAjaxRequest())
    return View(model);
else
    return PartialView("PartialName", model);

Точно такая же ситуация. Если я загружаю URL-адрес в браузере - он возвращает полную страницу, мастер и все ... Если я загружаю его позже, используя вызов ajax - просто загрузите частичное представление. Просто и легко. И все же придерживается методологии MVC:)

Кроме того, если вы абсолютно заинтересованы в предварительном выборе имени мастера ... просто сделайте это так:

return View("ViewName", "MasterName", model);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...