所以我有这样的页面:
....
现在我正在使用Ajax和所有更新此评论div。现在,如果用户禁用了javascript,则actionresult“Comments”仍然会返回partialView,除非这次它取代整个页面而不是div“CommentsDiv”。它破坏了页面的格式,因为母版页已经消失。整个网站都有很多这样的场景。
我可以普遍指定类似于如果要将partialView呈现为全视图,做一些事情! (比如可能重定向到一个虚拟的整页,主页只引用了部分视图)。还有其他方法吗?
请注意,我根本无法做“IsAjaxRequest”,因为第一次加载页面时,它不会是Ajax请求,但是actionresult仍然应该返回partialview。
答案 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是否可用是完全透明的。美丽而且非常干燥的东西,特别是如果包装到基础控制器中。
但是,我推测,因为你的问题不明确。