如果你正在做ajax,你应该做两个单独的动作还是做单独的视图?

时间:2014-02-15 14:54:14

标签: ajax asp.net-mvc asp.net-mvc-5

我对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)
    }

1 个答案:

答案 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请求的单独标记而变得混乱。