我正在尝试更改所有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);
}
答案 0 :(得分:1)
如果您仍然热衷于根据您的请求是否为ajax更改母版页 - 我只是偶然发现了您正在寻找的内容:
基本上,不是在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);