1

抽象クラスから派生するさまざまな具象型をインスタンス化するカスタム MVC モデル バインダーを含むクラス ライブラリがあります。モデル バインダーは、この投稿で説明されているものとほぼ同じです。

テスト用の MVC Web アプリケーションも含まれている同じ Visual Studio ソリューション内から使用すると、問題なく動作します。

私の問題は、アセンブリから nuget パッケージを作成し、それをまったく別の MVC アプリケーションに含めると、Global.asax.cs で正しく構成したにもかかわらず、モデル バインダーが機能しなくなることです。

CreateModel()髪を引っ張った後、別の MVC アプリでモデル バインダーを直接再作成しました。そうしているうちに、バインダーでオーバーライドされたメソッドが保護されていることに気付きました。実行されるようになり、保護されたキーワードが関係していると思われますが、その理由を正確に説明してください。

「ローカル」モデルバインダーを使用しても、さらに問題があります。実行して具体的なオブジェクトをインスタンス化しようとすると、例外が発生Could not load type XXXX from assembly { separate MVC project assembly name}するため、モデル バインダーが独自のアセンブリの外部から型を読み込めないようです。

なぜこれが起こるのか、そしてそれを回避するために私ができることについて、誰かが私にもっと情報を与えることができますか? モデル バインダーとモデルは、MVC アセンブリではなくクラス ライブラリに存在する必要があることに注意してください。

4

2 に答える 2

2

私はあなたと同じ問題を抱えていて、別のアセンブリのモデルにバインドしていましたが、別の解決策が必要でした。リンク先と同じモデル バインディングの例を使用しましたが、同じ例外も発生しました。Could not load type XXXX from assembly

具象型ごとに AssemblyQualifiedName を使用する必要がありました。だから私のビューにはこれが含まれています:

@Html.Hidden("ModelType", Model.GetType().AssemblyQualifiedName)

これの代わりに:

@Html.Hidden("ModelType", Model.GetType())

デフォルトのモデルバインダーは問題のアセンブリから型をロードできるため、なぜこれが必要なのか疑問に思っています。

于 2016-01-20T14:08:49.157 に答える
0

わかりましたので、私は愚かでした。いくつかの仮定が私を野生のガチョウの追跡に導いたことが判明しました。

ModelBinder は最初から正しく実行されていました。私のビューモデルには、抽象基本型でもあり、モデル バインダーを必要とする入れ子になったプロパティがありましたが、具体的な型を識別するために非表示のフィールドをビューに配置しておらず、それらを Global.asax 構成に追加していませんでした。これを行うと、すべてが期待どおりに機能し始めました。

于 2015-03-19T22:13:35.127 に答える