确定何时将部分视图呈现为全视图...并劫持渲染 - MVC

时间:2010-11-16 05:45:16

标签: asp.net-mvc

所以我有这样的页面:

....

现在我正在使用Ajax和所有更新此评论div。现在,如果用户禁用了javascript,则actionresult“Comments”仍然会返回partialView,除非这次它取代整个页面而不是div“CommentsDiv”。它破坏了页面的格式,因为母版页已经消失。整个网站都有很多这样的场景。

我可以普遍指定类似于如果要将partialView呈现为全视图,做一些事情! (比如可能重定向到一个虚拟的整页,主页只引用了部分视图)。还有其他方法吗?

请注意,我根本无法做“IsAjaxRequest”,因为第一次加载页面时,它不会是Ajax请求,但是actionresult仍然应该返回partialview。

1 个答案:

答案 0 :(得分:0)

如果我已经理解了你对IsAjaxRequest的评论,那么第一次加载页面时,你需要完整的视图,而不是部分...但这几乎是使用IsAjaxRequest的规范原因。

所以你需要的只是:

if (Request.IsAjaxRequest)
{
    return View();
}
else
{
   return PartialView("myPartial");
}

我能想到的唯一其他场景是您使用重定向的位置,例如,如果实现Post Redirect Get模式。在这种情况下,您可以覆盖控制器中的OnResultExecuted方法,以在TempData中存储IsAjaxRequest的结果。

这样,当Get请求命中服务器时,您可以在TempData中检查您的变量。如果它是空的,那么它是一个“原始”请求,所以返回整页。否则,它是重定向的请求,原始请求是一个Ajax请求,您可以安全地返回局部视图。即:

在控制器中写一个属性,如下所示:

public bool ImReallyAnAjaxRequest
{
    get
    {
        if (TempData["ImAjax"] == null) return false;
        if (TempData.ContainsKey("ImAjax"))
        {
            return (bool)TempData["ImAjax"];
        }
        else if (Request.IsAjaxRequest())
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

然后,按如下方式编写OnResultExecuted:

protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
    if (filterContext.Result is RedirectToRouteResult)
    {
        TempData[keyIsAjaxRequest] = Request.IsAjaxRequest();
    }
}

这样你可以覆盖所有角度,你可以在其他任何地方使用ImReallyAnAjaxRequest,并知道它会起作用,无论情况如何。或者更确切地说,我已经使用它来构建一个基本的WizardController,它对Ajax是否可用是完全透明的。美丽而且非常干燥的东西,特别是如果包装到基础控制器中。

但是,我推测,因为你的问题不明确。