1

「コア」バージョンと「カスタマイズ」バージョンを持つプロジェクトがあります。それらは別々のプロジェクトです。

「customized」は「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 メソッドを押すと、

コントローラー タイプ 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

今日、自分のプロジェクトで同じ問題に遭遇し、あなたの投稿に出くわしました。

私の場合、コア コントローラーのロジックが機能する方法を変更したくはありませんでしたが、そのコードを変更して、修飾子キーワードを変更することができました。virtualベースコントローラーのアクションとoverride、派生コントローラーのアクションに追加した後。元のコントローラーのアクションは引き続き機能し、派生コントローラーはカスタマイズされたアクションを使用し、あいまいなエラーはなくなりました。

Core コントローラーを変更できない場合があることは理解しています。その場合は、他の手段を使用してアクションを区別する必要があります。アクション名、パラメーター、または のカスタム実装などのその他のソリューションActionMethodSelectorAttribute。これがこの問題に対する私の最初の試みでしたが、その実装方法に行き着く前に、仮想/上書きソリューションを発見しました。残念ながら、そのルートで共有するコードはありません。

于 2015-02-04T01:23:02.617 に答える
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 に答える