继承自控制器,覆盖不同类型的save方法

时间:2013-02-13 11:15:05

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 controller

我的项目有'核心'版本和'自定义'版本。 它们是独立的项目。

'custom'从'core'继承功能,在某些情况下覆盖方法。

例如:

我有一个如下所示的用户模型:

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

然后,在一个单独的程序集中,

public class User : Core.User
{
    public string CustomProperty { get; set; }
}

然后我有一个控制器(在我的'核心'组件中)

public class UserController : Controller
{
    [HttpPost]
    public ActionResult SaveUser(User user)
    {
    }
}

在我的其他项目中,我有一个继承自Core.UserController的UserController:

public class UserController : Core.UserController
{
    [HttpPost]
    public ActionResult SaveUser(Custom.User user)
    {
    }
}

显然,在我的Global.asax中,我已经映射了控制器命名空间

然而,当我点击SaveUser方法时,我得到了

  

控制器类型上当前的SaveUser操作请求   UserController在以下操作方法

之间不明确

虽然我理解这个问题,但有什么方法可以解决这个问题吗?

简而言之:

我想使用Core.UserController方法大多数,但在这种情况下,我需要使用我的Custom.UserController SaveUser方法(因为它需要我的{{1} }})}

3 个答案:

答案 0 :(得分:2)

多态性?

public class UserController : Controller
{
    [HttpPost]
    public virtual ActionResult SaveUser(User user)
    {
    }
}

public class UserController : Core.UserController
{
    [HttpPost]
    public override ActionResult SaveUser(User user)
    {
         var customUser = user as Custom.User;

         if(customUser != null)
         {
             //Your code here ...
         }      
    }
}

答案 1 :(得分:0)

如果多态解决方案不起作用或不可接受,另一种可能的解决方法是将UserController或其操作方法重命名为略有不同的方法:

public class CustomUserController : Core.UserController
{
    [HttpPost]
    public ActionResult SaveUser(Custom.User user)
    {
    }
}

public class UserController : Core.UserController
{
    [HttpPost]
    public ActionResult SaveCustomUser(Custom.User user)
    {
    }
}

如果您希望保持路线与其他项目一致,则只需为此创建自定义路线。

答案 2 :(得分:0)

我今天在自己的项目中遇到了同样的问题并且发现了你的帖子。

在我的情况下,虽然我不想改变核心控制器的逻辑的运行方式,但我能够对其代码进行更改,从而改变其修饰符关键字。将virtual添加到基本控制器的操作后,将override添加到我的派生控制器的操作中。原始控制器的操作仍然有效,我的派生控制器使用我自定义的操作,没有更多的模糊错误。

我意识到您可能无法修改您的Core控制器,如果是这种情况,那么您需要使用其他方法来区分您的操作。操作名称,参数或其他解决方案,例如ActionMethodSelectorAttribute的自定义实现。这是我第一次尝试这个问题,但在我走得太远之前,我发现了虚拟/覆盖解决方案。不幸的是,我没有代码在该路线上分享。