我的项目有'核心'版本和'自定义'版本。 它们是独立的项目。
'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} }})}
答案 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
的自定义实现。这是我第一次尝试这个问题,但在我走得太远之前,我发现了虚拟/覆盖解决方案。不幸的是,我没有代码在该路线上分享。