2010-09-10 81 views
1

MVC的一个优点是可以在普通Web调用以及Ajax调用中使用Actions。但是这样做对我的代码有点不舒服。我想知道别人的想法。如何在ASP.Net中处理对控制器的Ajax调用MVC

所以我想查看列表中项目的详细信息。我创建了一个Details视图。我也决定使用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()); 
}  

但是据我所知,没有属性筛选阿贾克斯VS正常通话。

如何编写Ajax调用?

UPDATE Clicktricity的确的确有正确的答案。一个额外的变化,不过是,自2控制器方法不能有相同的签名,我需要写控制器代码这样:

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

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

有趣的一点 – Clicktricity 2010-09-13 19:45:20

回答

3

你是正确的,没有一个过滤器,这是否 - 但是以典型的MVC方式,没有理由不写你自己的。

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

然后,您可以在您的操作方法上使用[AjaxRequest]

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

+0

+1的答案,和伴随的警告! – 2010-09-11 19:40:46

相关问题