少なくとも、それは問題に関連していると思います。私のシナリオはこれです:
共通のフィールドを持つ多くのビジネス エンティティがあり、それぞれにそのエンティティに固有のカスタム フィールドがあります。したがって、コードでは、これはクラスとしてモデル化され、EntityBase
これから派生する多くのクラスがありますDerived
。
再利用可能な UI を作成するために、EntityBase.vbhtml
次のようなビューを用意しました。
@ModelType EntityBase
@Using Html.BeginForm("Edit", Model.GetType.Name)
@* show the editor template for the derived type *@
@* !!the next line renders nothing!! *@
@Html.EditorFor(Function(x) Model, Model.GetType.Name)
[show a bunch of stuff common to all EntityBase objects]
End Using
そして、Derived.vbhtml
これを行う派生クラスが呼び出されました。
@ModelType Derived
[show an EditorFor for various Derived-specific fields]
次に、 に移動すると\Derived\Edit\123
、デフォルトのビューが返されます。これは次のDerived\Edit.vbhtml
ことを行うだけです:
@Html.EditorForModel("EntityBase")
このように、コントローラーは期待されるデフォルトの編集ビューを返すだけです。これは、ビューへのワンライナー呼び出しであり、そのことを実行し、知識のない派生クラスのものをレンダリングするためにEntityBase
を呼び出します。Derived
これは目立たないと思いましたが、うまくいきません。ビュー コードに示されているように、基本クラス ビュー内で EditorForModel を呼び出し、テンプレートとして使用する派生クラスの名前を指定すると、何もレンダリングされません。最上位の Edit テンプレートでこれとまったく同じコード行を呼び出すと、正常に動作することをテストしました。したがって、MVC が気に入らない継承についての何かがありますが、何がわかりません。助けてください!
更新EditorFor
:使用する代わりに (そして、対応するテンプレートを EditorTemplates フォルダーから Shared フォルダーに移動する) と期待どおりに機能しPartial
ますが、EditorFor テンプレートの命名規則に従わないと混乱すると思うため、これは優れた解決策ではありません。