我对MVC中Ajax的正确方法感到有些困惑。假设我有一个返回相同视图和相同模型的操作。唯一的问题是如果它是一个Ajax调用我需要重新排列视图的布局。我发现解决方案是我可以在MVC操作我们if (IsAjax)
中确定它并返回相应的视图,否则我可以转到我的视图并相应地使用@if(IsAjax)
和布局项。
@model MyModels.SomeModel
@if (!IsAjax)
{
arrange this way.....
}
else
{
arrange another way...
}
[AllowAnonymous]
public ActionResult Details(int? id)
{
///get the SomeModel via some code here
if (!Request.IsAjaxRequest())
{
return View2(someModel)
}
return View1(someModel)
}
答案 0 :(得分:2)
确定请求是否是AJAX请求应该是控制器的责任。现在,您是否想要创建一个单独的操作方法来处理AJAX请求取决于您,但我认为这是更清洁的方法。我将在我的项目中解释如何处理它。
首先,创建一个自定义属性来标记要处理AJAX请求的操作方法。
public class AjaxOnlyAttribute : ActionMethodSelectorAttribute
{
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
return controllerContext.HttpContext.Request.IsAjaxRequest();
}
}
现在您的控制器可以有单独的操作方法,一个用于处理AJAX请求,另一个用于处理正常请求。
[AllowAnonymous]
public ActionResult Details(int? id)
{
// Handle the normal request
return View(model);
}
[ActionName("Details")]
[AllowAnonymous]
[AjaxOnly]
public ActionResult DetailsAjax(int? id)
{
// Handle the AJAX request
return PartialView("PartialViewForAJAX", model);
}
请注意,您必须重命名AJAX操作方法,因为您不能拥有两个名称相同的操作方法。使用[ActionName("Details")]
属性标记此操作方法可确保该方法将处理对Details
操作方法的所有AJAX请求。
这是我发现分离控制器和查看AJAX请求标记的最简洁方法。它不仅允许您将代码保持在控制器中,而且还确保您的视图不会因为AJAX请求的单独标记而变得混乱。