0

我正在尝试使用劫持来使用 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
}

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

4

1 回答 1

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;
}
于 2012-01-16T07:10:07.153 回答