首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定部分视图何时呈现为全视图..。劫持渲染- MVC

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

Stack Overflow用户
提问于 2010-11-16 05:45:16
回答 1查看 179关注 0票数 0

所以我有这样的一页:

……

现在,我正在使用Ajax和所有这些更新这个注释div。现在,如果用户禁用了javascript,操作结果“注释”仍然返回partialView,但这次它将替换整个页面,而不是只返回div "CommentsDiv“。它破坏了页面的格式,因为母版页已经消失。整个网站都有很多这样的场景。

如果partialView即将呈现为全视图,我可以普遍指定这样的内容吗?!(就像可能重定向到一个仅引用部分视图的主页的虚拟全页)。还有其他方法吗?

注意到我根本不能做"IsAjaxRequest",因为第一次加载页面时,它不会是Ajax请求,但是操作结果仍然应该返回partialview。

EN

回答 1

Stack Overflow用户

发布于 2010-11-16 09:20:59

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

所以你所需要的就是:

代码语言:javascript
复制
if (Request.IsAjaxRequest)
{
    return View();
}
else
{
   return PartialView("myPartial");
}

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

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

在控制器中写入属性如下:

代码语言:javascript
复制
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:

代码语言:javascript
复制
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
    if (filterContext.Result is RedirectToRouteResult)
    {
        TempData[keyIsAjaxRequest] = Request.IsAjaxRequest();
    }
}

这样你就可以覆盖所有的角度,你可以在其他任何地方使用ImReallyAnAjaxRequest,并且知道它会工作,不管是什么场景。或者说,我使用它构建了一个对Ajax可用或不可用的完全透明的基础WizardController。非常干燥的东西,尤指包装在底座控制器上的东西

不过,我猜想,因为你的问题还不清楚。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4191527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档