6

少なくとも、それは問題に関連していると思います。私のシナリオはこれです:

共通のフィールドを持つ多くのビジネス エンティティがあり、それぞれにそのエンティティに固有のカスタム フィールドがあります。したがって、コードでは、これはクラスとしてモデル化され、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 テンプレートの命名規則に従わないと混乱すると思うため、これは優れた解決策ではありません。

4

1 に答える 1

3

この状況では、MVC は名前付きテンプレートを見つけられませんが、テンプレートへのフル パスを指定すると、見つけられるようです。したがって、これ以上戦うのではなく、次のヘルパー関数を実装しました。

<Extension()> _
Public Function EditorForObject(Of T, TValue)(ByVal htmlHelper As HtmlHelper(Of T), ByVal obj As TValue) As IHtmlString
    Dim sTemplateName = "~/Views/Shared/EditorTemplates/" & obj.GetType.Name & ".vbhtml"

    'Return htmlHelper.EditorFor(Function(x) obj) <-- this should work but doesn't
    Return htmlHelper.Partial(sTemplateName, obj)
End Function

英語では、オブジェクトに型名を尋ね、その型のエディター テンプレートへの明示的なパスを作成し、オブジェクトとテンプレートへの完全パスを指定して HtmlHelper.Partial を呼び出すことを意味します。これはより一般的である可能性があると確信しています(vb用にハードコードされていません)が、機能します。

次に、使用法は次のようになります。

@Html.EditorForObject(Model)

実際、これは私がやろうとしていたことよりもさらに優れています。

@Html.EditorFor(Function(x) Model, Model.GetType.Name)

テンプレート ルックアップの問題がなくても、オブジェクトを返すだけのダミー ラムダではなく、オブジェクトを編集 (または表示) するために渡すことができると便利なので、これは便利です。

それでも、ルックアップの問題は MVC のバグに違いないと思います。(時間があれば、ソースコードを確認できると思います。) 誰かこれについて確認またはコメントできますか?

于 2011-11-30T15:01:24.303 に答える