2010-06-29 34 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

相關問題