如何在ASP.Net MVC中处理对控制器的Ajax调用

时间:2010-09-10 20:14:40

标签: asp.net-mvc ajax

MVC的一个优点是能够将Actions用于普通Web调用以及Ajax调用。但是这样做,我对我的代码感到有点不舒服。我想知道其他人的想法。

所以我想查看列表中项目的详细信息。我创建了一个详细信息视图。我也决定使用hijaxing - 如果用户启用了Javascript,我希望Details表单是一个弹出窗口。所以对于Details.aspx,我需要完整的html,但如果它是一个ajax请求,我只需要表单元素。所以这就是我编写控制器方法的方法:

public ActionResult Details(int id)
{
    if (Request.IsAjaxRequest())
    {
        return PartialView(GetAjaxModel());
    }
    else
        return View(GetModel());
}

它有效,但每当我对我的整个代码都有一个巨大的“if”语句时,它就会让我烦恼。我怎样才能摆脱它并/或使代码变得更好?

我还可以编写一个名为AjaxDetails的独立方法,但我真正想写的是:

public ActionResult Details(int id)
{
        return View(GetModel());
}

[Ajax]
public ActionResult Details(int id)
{
    return View(GetAjaxModel());
}    

但据我所知,没有过滤Ajax与正常调用的属性。

你如何编写Ajax调用?

更新 Clicktricity确实有正确的答案。然而,另一个变化是,由于2个控制器方法不能具有相同的签名,我需要编写控制器代码:

public ActionResult Details(int id)
{
        return View(GetModel());
}

[AjaxRequest]
[ActionName("Details")]
public ActionResult DetailsAjax(int id)
{
    return PartialView(GetAjaxModel());
}    

1 个答案:

答案 0 :(得分:3)

你说没有一个过滤器可以做到这一点是正确的 - 但是在一种典型的MVC方式中,你没有理由不能自己编写。

public class AjaxRequestAttribute : ActionMethodSelectorAttribute
{
    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
    {
        return (controllerContext.HttpContext.Request.IsAjaxRequest())
    }
}

然后,您可以在行动方法上使用[AjaxRequest]

(请注意,我没有测试过这个)