为什么OnActionExecuted中的MasterName始终为空?

时间:2010-04-23 12:03:47

标签: c# asp.net-mvc-2

我正在尝试更改所有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 个答案:

答案 0 :(得分:1)

如果您仍然热衷于根据您的请求是否为ajax更改母版页 - 我只是偶然发现了您正在寻找的内容:

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

基本上,不是在BaseController中覆盖OnActionExecuting方法 - 而是覆盖View方法!你可以得到你想要的东西,使用一种似乎专门为它设计的方法:)

protected override ViewResult View(string viewName, string masterName, object model)
{
    return base.View(viewName, Request.IsAjaxRequest() ? "Empty" : masterName, model);
}

答案 1 :(得分:0)

所以当你对.ascx“pages”执行操作时,你说MasterPage是空的?

.ascx不是页面,它们是UserControls / PartialViews。因此他们没有母版页。它们可以放在一个法师或母版页中..但如果你的请求返回.ascx,它将没有母版页。)

<强> UPD: 这很可能是因为MVC的工作方式 - 所有3个部分(M-V-C)完全独立。这意味着当您的代码在控制器内部执行时,我们对该视图一无所知。 View是选择母版页而不是控制器的版本。

如果您尝试更改应用程序在控制器内部的外观(更改母版页)的方式,那么您最有可能做错了什么。它首先设计了上下文的分离,你试图绕过它:)

<强> UPD2: 所以你说你想要返回常规请求的整页+主页面,而只是返回没有主页面(好吧,至少是干净的)ajax请求的页面?你还在尝试错误的方法。

以下是我一直在做的事情:

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

完全相同的情况。如果我在浏览器中加载url - 它会返回整页,master和all ..如果我稍后加载它,使用ajax调用 - 只需加载局部视图。简单易行。并且仍然遵循MVC方法:)

另外,如果你非常热衷于预选主人名......就这样做:

return View("ViewName", "MasterName", model);