Asp.net MVC hijaxing返回视图修复

时间:2012-01-15 23:50:52

标签: jquery ajax asp.net-mvc asp.net-mvc-partialview

我正在尝试使用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,则检查并返回正确的视图。或者可能是某种基本控制器?我不知道如何实现这两个想法,所以任何指导都会很棒。

1 个答案:

答案 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;
}
相关问题