C# 为什么在OnActionExecuted中MasterName总是空白?

C# 为什么在OnActionExecuted中MasterName总是空白?,c#,asp.net-mvc-2,C#,Asp.net Mvc 2,我正在尝试更改所有aspx页面的母版页。由于某些原因,我无法检测何时为ascx页面调用此函数。如有任何帮助,我们将不胜感激 protected override void OnActionExecuted(ActionExecutedContext filterContext) { var action = filterContext.Result as ViewResult; if (action != null && action.MasterName !=

我正在尝试更改所有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);
}

你是说当你对.ascx“页面”执行操作时,母版页是空的

.ascx不是页面,而是用户控件/部分视图。因此,它们没有母版页。它们可以放在法师或母版页中。。但是,如果您的请求返回.ascx,它将没有母版页..)

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

Tbh如果您试图更改应用程序在控制器内的外观(更改母版页),则很可能是您做错了什么。它的设计首先考虑了上下文的分离,而您正试图绕过它:)

UPD2: 那么您是说,对于常规请求,您希望返回完整的页面+母版页,对于ajax请求,只返回没有母版的页面(至少是干净的)?你仍然在尝试错误的方法

以下是我一直在做的:

if (!Request.IsAjaxRequest())
    return View(model);
else
    return PartialView("PartialName", model);
完全相同的情况。如果我在浏览器中加载url,它将返回完整页面、母版和全部。。如果我以后使用ajax调用加载它,只需加载部分视图即可。简单易用。并且仍然坚持MVC方法:)

此外,如果您非常喜欢预选主控名称。。就这样做吧:

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

如果您仍然热衷于根据您的请求是否为ajax来更改母版页,我只是偶然发现了您想要的东西:

基本上,与其在BaseController中过度限定OnActionExecuting方法,不如重写View方法!使用一种似乎专门为其设计的方法,您可以得到您想要的东西:)


不,我是说即使在执行.aspx页面时母版页也是空的。我想要的是一个中心位置来更改母版页,这取决于它是Ajax请求还是普通请求。我真的不在乎在哪里做,但到目前为止,我遇到的唯一中心位置是在基地控制器中。顺便说一句,这在VS2010 RC中运行良好,但在MVC2/VS2010的RTM版本中不起作用。仔细考虑后,我实际上不同意更改母版页只属于控制器。视图本身应该只关注它的外观(即视图的内容),然后控制器应该“控制”视图呈现的上下文(即母版页)。。除非我误解了你,否则Ajax请求应该返回Json结果。。。而且一开始不会有母版页,不是吗?母版页没有任何功能。。母版页只是数据的可视化表示。。与视图完全相同。。或者你说的是“其他”母版页=/正是我需要的。非常感谢:)
protected override ViewResult View(string viewName, string masterName, object model)
{
    return base.View(viewName, Request.IsAjaxRequest() ? "Empty" : masterName, model);
}