1

我有一个具有“核心”版本和“定制”版本的项目。它们是单独的项目。

“定制”从“核心”继承功能,在某些情况下会覆盖方法。

例如:

我有一个看起来像这样的用户模型:

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 方法时,我得到

当前对控制器类型 UserController 的操作 SaveUser 的请求在以下操作方法之间不明确

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

简而言之:

我大部分时间都想使用Core.UserController方法,但在这种情况下,我需要使用我的SaveUser 方法(因为它需要我的类型)Custom.UserControllerCustom.User

4

3 回答 3

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 ...
         }      
    }
}
于 2013-02-13T11:35:38.777 回答
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)
    {
    }
}

如果您想让路由与其他项目保持一致,您只需为此创建一个自定义路由。

于 2013-02-13T12:25:17.123 回答
0

我今天在自己的项目中遇到了同样的问题,并遇到了您的帖子。

在我的例子中,虽然我不想改变核心控制器的逻辑运作方式,但我能够改变它的代码,从而改变它的修饰符关键字。在添加virtual到基本控制器的操作和override我的派生控制器的操作之后。原始控制器的动作仍然有效,我的派生控制器使用我自定义的动作,不再有模棱两可的错误。

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

于 2015-02-04T01:23:02.617 回答