2010-06-29 80 views
1

有没有办法强制请求路由器基于方法签名来消除控制器操作的歧义?根据结果类型区分同名控制器操作?

例如(在控制器):

[HttpPost] 
public ActionResult MyAction(FormCollection f) { 
    //do stuff with big form and return viewresult 
    return View(); 
} 

[HttpPost] 
public JsonResult MyAction(string foo, string bar, bool baz) { 
    //separate method to handle just the ajax stuff 
    return Json(); 
} 

我知道我可以在第一种方法使用Request.IsAjaxRequest()和使用,如果/然后转移到决定了我的动作......但感觉清洁工留下他们单独的方法。更何况我不得不抛出布尔型'baz'(以及任何其他非字符串类型)。我有一个合法的理由来使用FormCollection有时候,否则我只是保留JsonResult版本。 (formcollection允许编辑'many'项目,而Json参数化版本只是编辑单个项目)

我也可以使用不同的方法名称......(可能是我做什么,如果我不能做什么我想)

我试着将第一个方法的返回类型显式设置为ViewResult,并确保客户端只发送接受:application/json头,但似乎并不重要,因为我不断收到关于方法签名的异常暧昧。有没有办法强制我想要的行为?

回答

0

从我所经历的情况来看,ASP.NET MVC并不喜欢尝试重载方法。您最好将其作为一个方法与if/else一起使用,或者制作另一个专门针对Ajax请求的Action。

0

MVC框架不使用方法的返回类型来过滤方法。

如果你真的想这样做,你可以编写你自己的ActionFilter。

0

我同意能够根据返回类型选择操作将会更清洁。你可以实现你自己的IActionInvoker类来做到这一点。

+0

这似乎是一个有用的建议......但是,它似乎会过分复杂化一些事情。就像战斗框架有点太... – 2010-06-30 16:31:42

+0

这些可扩展性点存在的原因。 – Ryan 2010-06-30 17:24:46

+1

虽然我喜欢动作过滤器建议。这是我们为所有表格数据所做的。该行为本身返回一个表格模型。然后,操作筛选器查看请求以确定表是否应呈现为Json(用于jqgrid),Html,Csv或Pdf。然后,我们转换表格模型以获得结果(在此使用访问者模式)。这非常有用,因为行动不必担心请求;它只是返回数据。 – Ryan 2010-06-30 17:28:34

相关问题