ASP.NET MVC - 用不同的参数覆盖一个动作
Posted
技术标签:
【中文标题】ASP.NET MVC - 用不同的参数覆盖一个动作【英文标题】:ASP.NET MVC - Overriding an action with differing parameters 【发布时间】:2011-04-22 20:47:19 【问题描述】:我有一个继承自基本控制器的控制器。两者都有一个带有两个参数的编辑(发布)操作:
在基本控制器上:
[HttpPost]
public virtual ActionResult Edit(IdType id, FormCollection form)
在派生控制器中:
[HttpPost]
public ActionResult Edit(int id, SomeViewModel viewModel)
如果我这样离开它,我会得到一个异常,因为有一个模棱两可的调用。但是,我不能在派生操作上使用override
,因为方法签名不完全匹配。有什么我可以在这里做的吗?
【问题讨论】:
【参考方案1】:除了 Developer Art 的回答之外,一种解决方法是:
保持基方法不变,在派生类中实现基方法并用[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
【讨论】:
是的,这行得通。似乎有点 hacky ;) 所以我把这个问题留了一段时间,以防有其他想法 - 否则它会完成这项工作。谢谢。 属性是[NonAction]
而不是 [NoAction]
,您的解决方案节省了我的时间【参考方案2】:
我会把它锁起来:
在基本控制器上:
[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 方法传递给另一个 Post 应该可以工作。这种方式可能存在安全隐患。
【讨论】:
【参考方案3】:这就是你需要做的一切 在 Base 控制器上:
添加虚拟关键字
在派生控制器上:
添加覆盖关键字
【讨论】:
以上是关于ASP.NET MVC - 用不同的参数覆盖一个动作的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Asp.net MVC 不能区分具有不同参数的两个动作?
ASP.NET Identity,多个用户具有相同的用户名,但属于不同的公司。覆盖 FindAsync?
ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据