我正在尝试使用hvack来使用mvc来执行单页Web应用程序。我找到的问题是如何切换控制器以有效方式返回的布局。
最明显的非有效解决方案是在每个控制器上使用此代码:
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,则检查并返回正确的视图。或者可能是某种基本控制器?我不知道如何实现这两个想法,所以任何指导都会很棒。
答案 0 :(得分: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;
}