根据结果​​类型消除同名控制器操作的歧义?

时间:2010-06-29 19:18:15

标签: c# asp.net-mvc

有没有办法强制请求路由器根据方法签名消除控制器操作的歧义?

例如

(在控制器中):

[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()并使用if / then分支来决定我的行动......但是让它们分开的方法感觉更清晰。更不用说我必须抛出布尔'baz'(以及任何其他非字符串类型)。我有正当理由有时使用FormCollection,否则我只会保留JsonResult版本。 (formcollection允许编辑'many'项目,而Json参数化版本只编辑单个项目)

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

我尝试将第一种方法的返回类型显式设置为ViewResult并确保客户端仅发送了accept:application / json标头,但似乎并不重要,因为我不断获得有关方法签名不明确的异常。有没有办法强迫我想要的行为?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

从我的经验来看,ASP.NET MVC并不喜欢尝试重载方法。你最好把它作为if / else的一个方法,或者让另一个Action专门响应Ajax请求。

答案 2 :(得分:0)

我同意能够根据返回类型选择一个动作会更清晰。您可以实现自己的IActionInvoker类来执行此操作。