代码之家  ›  专栏  ›  技术社区  ›  John

如何处理中对控制器的Ajax调用ASP.NetMVC公司

  •  1
  • John  · 技术社区  · 14 年前

    MVC的优点之一是能够对普通web调用和Ajax调用使用动作。但是这样做,我对我的代码有点不舒服。我想知道别人怎么想。

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

    它可以工作,但每当我有一个巨大的“如果”语句围绕着我的整个代码,它困扰着我。我怎样才能摆脱它和/或使代码更好?

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

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

    但据我所知,没有过滤Ajax和普通调用的属性。

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

    public ActionResult Details(int id)
    {
            return View(GetModel());
    }
    
    [AjaxRequest]
    [ActionName("Details")]
    public ActionResult DetailsAjax(int id)
    {
        return PartialView(GetAjaxModel());
    }    
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   Clicktricity    14 年前

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

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

    那你可以用 [AjaxRequest]

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