2010-10-08 68 views
2

我有一個從基礎控制器繼承的控制器。兩者都有其需要兩個參數編輯(後)動作:ASP.NET MVC - 用不同的參數覆蓋一個動作

在基地控制器:

[HttpPost] 
public virtual ActionResult Edit(IdType id, FormCollection form) 

而派生控制器:

[HttpPost] 
public ActionResult Edit(int id, SomeViewModel viewModel) 

如果我離開它這樣,我得到一個例外,因爲有一個模糊的電話。但是,我不能在派生操作上使用override,因爲方法簽名不完全匹配。我能在這裏做什麼嗎?

回答

9

由於除了開發商藝術的回答一個解決辦法是:

離開基地的方法,因爲它是在你的派生類中實現基本方法,並與[NonAction]

[NonAction] 
public override ActionResult Edit(IdType id, FormCollection form) 
{ 
    // do nothing or throw exception 
} 

[HttpPost] 
public ActionResult Edit(int id, SomeViewModel viewModel) 
{ 
    // your implementation 
} 
+0

啊,好的。我會試試這個... – UpTheCreek 2010-10-08 12:51:18

+0

是的,那是有效的。似乎有點冒險;)所以我留下了一段時間的問題,以防有其他想法 - 否則它會完成這項工作。謝謝。 – UpTheCreek 2010-10-08 12:57:51

+2

屬性是'[NonAction]'不''[NoAction]',您的解決方案節省了我的一天 – RezaRahmati 2014-04-11 12:06:23

1

我想將其標註爲連鎖它:

在基座控制器:

[HttpPost] 
public virtual ActionResult Edit(IdType id, FormCollection form) 

而派生控制器:

[HttpPost] 
public virtual ActionResult Edit(IdType id, FormCollection form) 
{ 
    var newId = //some enum? transform 
    var boundModel = UpdateModel(new SomeViewModel(), form); 

    return Edit(newId, boundModel); 
} 

[HttpPost] 
public ActionResult Edit(int id, SomeViewModel viewModel) 

我沒有測試過這一點,通過POST方法到另一個帖子應該工作。這樣可能會產生安全影響。

+0

謝謝,我也會試試。 – UpTheCreek 2010-10-08 14:26:39