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混合应用传参并绑定数据

ASP.NET MVC XML绑定Action参数列表

无法覆盖 Kendo Grid 过滤器消息 (ASP.NET MVC)

在 ASP.NET MVC 3 中创建基于平台显示不同视图的自定义 ViewResult