我试图找出当通过ajax发出请求时如何自动将视图呈现为部分(无母版页)。
我想避免的是在每个可以返回ajax的控制器方法中使用以下代码(因为那不是很干):
return Request.IsAjaxRequest() ? PartialView(model) : View(model)
我的第一个想法是在View
方法中将检查添加到我的基本控制器中。但是view方法返回View
(PartialView
不继承)。失败了。
我的下一次尝试是尝试在我的自定义剃刀视图引擎中进行检查,如果它是ajax请求,则简单地删除母版页。但那也失败了。
我可以做的是创建一个新方法ViewOrPartial
,其中包含检查并相应地返回结果。
你会怎么做?
答案 0 :(得分:8)
如何实现以下目标:
@{
Layout = !Request.IsAjaxRequest() ? "~/Views/Shared/_Layout.cshtml" : null;
}
在您的~/Views/_ViewStart.cshtml
和控制器操作中,只需返回一个视图:
return View(model);
所有剃须刀视图都使用_ViewStart.cshtml
。这是指定母版页的位置。因此,通过进行此更改,如果请求不是AJAX请求,则所有视图将自动仅有条件地应用母版页。很干。
答案 1 :(得分:0)
答案 2 :(得分:0)
另一种方法是通过jQuery加载它:Using jQuery ajax to load a partial view in ASP.NET MVC and then retrieve the input on the server again。
答案 3 :(得分:0)
我在实践中发现IsAjaxRequest
并非100%可靠。
对于来自移动设备的大量请求,它偶尔会在Ajax调用上返回false
。
我最后在我的Ajax请求中添加了一个查询字符串参数(例如partial = 1),以确保控制器没有被欺骗。这是围绕MVC 4,所以可能已经纠正过,但我不能冒险。
public bool IsPartialPageRequest
{
get
{
return Request.IsAjaxRequest() || !string.IsNullOrEmpty(Request["partial"]);
}
}
if (!base.IsPartialPageRequest)
{
ViewBag.Layout = "~/Views/Shared/_Layout.cshtml";
}
@{
Layout = ViewBag.Layout;
}
我确保我总是将&partial=1
添加到我的Ajax请求中(以防万一),并且自那以后它已经100%可靠。