【问题标题】:ASP.NET MVC - Overriding an action with differing parametersASP.NET MVC - 用不同的参数覆盖一个动作
【发布时间】:2011-04-22 20:47:19
【问题描述】:

我有一个继承自基本控制器的控制器。两者都有一个带有两个参数的编辑(发布)操作:

在基本控制器上:

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

在派生控制器中:

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

如果我这样离开它,我会得到一个异常,因为有一个模棱两可的调用。但是,我不能在派生操作上使用override,因为方法签名不完全匹配。有什么我可以在这里做的吗?

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案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 控制器上:

      添加虚拟关键字

      在派生控制器上:

      添加覆盖关键字

      【讨论】:

        猜你喜欢
        • 2023-03-12
        • 2016-11-17
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 2011-09-22
        相关资源
        最近更新 更多