【问题标题】:determine when a partialview is going to be rendered as fullview... and hijack the rendering - MVC确定何时将部分视图渲染为全视图...并劫持渲染 - MVC
【发布时间】:2011-05-10 15:26:36
【问题描述】:

所以我有这样的页面:

....

现在我正在使用 Ajax 和所有方式更新此评论 div。现在,如果用户禁用了 javascript,则 actionresult “Comments” 仍然会返回 partialView,只不过这次它替换了整个页面,而不仅仅是 div “CommentsDiv”。它破坏了页面的格式,因为母版页不见了。整个网站有很多这样的场景。

我可以普遍指定一些东西,比如如果一个 partialView 即将被渲染为全视图,做点什么!! (比如可能重定向到一个虚拟的整页,母版页只引用部分视图)。还有其他方法吗?

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

【问题讨论】:

  • 实现这个的方法是通过Request.IsAjaxRequest,我不明白你为什么不能使用它。

标签: asp.net-mvc


【解决方案1】:

如果我理解了您对 IsAjaxRequest 的评论,那么在第一次加载页面时,您需要的是完整视图,而不是部分视图……但这几乎是使用 IsAjaxRequest 的典型原因。

所以你只需要:

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

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

这样,当 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 并且知道它会起作用,无论场景如何。或者更确切地说,我已经使用它来构建一个对 Ajax 是否可用完全透明的基础 WizardController。一个美丽而干燥的东西,特别是如果打包到一个基本控制器中。

但是,我推测,因为您的问题不清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    相关资源
    最近更新 更多