2010-04-23 33 views
0

我试图让所有我的ASPX页面更改主页面。出于某种原因,我无法检测何时为ascx页面调用此函数。任何帮助纠正这一点,将不胜感激。为什么在OnActionExecuted中始终将MasterName留空?

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); 
} 

回答

1

如果你还热衷于改变我只是不小心绊上完全相同的事情,你正在寻找 - 基于一个事实,你的要求是阿贾克斯与否母版页:

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

基本上,而不是在BaseController overriging的OnActionExecuting方法 - 重写View方法!你得到正是你想要的东西,与似乎专门为它设计的方法:)

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

正是我需要的。非常感谢你:) – devzero 2010-04-29 08:47:55

+0

非常欢迎您! :) – 2010-04-29 08:58:23

0

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

.ascx's不是页面,它们是UserControls/PartialViews。因此他们没有母版页。他们可以在一个法师,或母版页被删除。但是,如果你的请求返回一个名为.ascx,它不会有一个母版页。)

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

如果您尝试更改应用程序在控制器中的外观(更改主控页面)的方式 - 您很可能做错了事情。它被设计在首位上下文的分离,你想出去转转吧:)

UPD2: 所以你说要返回完整的网页+母版页定期请求,而只是没有主人的页面(以及干净至少)的Ajax请求?你仍然在尝试错误的方法。

这就是我一直在做,而不是:

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

完全一样的情况。如果我在浏览器中加载url,它会返回完整的页面,master和all ..如果稍后加载它,使用ajax调用 - 只加载部分视图。简单而简单。而仍然坚持MVC方法:)

另外,如果你在预选主名称绝对热衷..只是不喜欢这样写道:

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

不,我是说,母版是空的,即使我在执行一个.aspx页面。 – devzero 2010-04-23 12:11:15

+0

添加更新 – 2010-04-23 12:24:07

+0

我想要的是一个中心位置来更改主页面,具体取决于它是Ajax请求还是普通请求。我并不在乎我在哪里做,但我迄今为止唯一遇到的中心位置是基础控制器。顺便说一句,这在VS2010 RC工作正常,但不适用于RTM版本的MVC2/VS2010。 – devzero 2010-04-23 12:56:40