2012-01-15 68 views
0

我想使用劫持做一个使用mvc的单页web应用程序。我发现的问题是如何切换控制器以有效方式返回的布局。Asp.net MVC hijaxing返回视图修复

最明显的非有效的解决方案是使用每个控制器上运行此代码:

if (Request.IsAjaxRequest()) 
{ 
    return PartialView(); 
} 
else 
{ 
    viewdata["controller"]= "x"; viewdata["action"]= "y"; 
    return View("defaultview"); //I need view data because only one template main 
           //view is returned and based on the viewdata the main 
           //view loads the right partial view inside it 
} 

有没有办法做到上面的代码更简单的方法?也许使用自定义的viewresult,它会检查,如果请求是AJAX,并返回正确的视图。或者也许是某种基本控制器?我不知道如何实施这两个想法,所以任何指导都会很棒。

回答

2

一种可能性是编写自定义操作筛选器并订阅OnActionExecuted事件。在里面你会检查是否使用AJAX请求调用了该操作,以及是否返回了查看结果。在这种情况下,你将取代这一观点与结果的局部视图结果:

public class LayoutSelectorAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var result = filterContext.Result as ViewResult; 
     if (filterContext.HttpContext.Request.IsAjaxRequest() && result != null) 
     { 
      var partialViewResult = new PartialViewResult 
      { 
       ViewName = result.ViewName, 
       ViewData = result.ViewData, 
       TempData = result.TempData 
      }; 
      filterContext.Result = partialViewResult; 
     } 
    } 
} 

现在你可以装饰你的控制器或动作与此属性。

如果您正在使用Razor视图引擎的另一种可能性是调整你的_ViewStart.cshtml文件,该文件是在布局定义:

@{ 
    Layout = !ViewContext.HttpContext.Request.IsAjaxRequest() 
     ? "~/Views/Shared/_Layout.cshtml" 
     : null; 
}