2011-11-23 8 views
6

少なくとも、私は問題に関連していると思います。私のシナリオは次のとおりです。EditorForは派生型では機能しません

私は共通のフィールドを持ついくつかのビジネスエンティティを持っており、それぞれにそのエンティティに固有のカスタムフィールドがあります。したがって、コードでは、これはEntityBaseクラスとしてモデル化されており、これに由来するクラスはいくつかあります(例:Derived)。

@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 

、その後1本ない派生クラスのDerived.vbhtml呼ば:

@ModelType Derived 
[show an EditorFor for various Derived-specific fields] 

は、再利用可能なUIを作るために、私はこのようになります EntityBase.vbhtmlというビューを持っています次に、 \Derived\Edit\123に移動すると、既定のビュー Derived\Edit.vbhtmlが返されます。

@Html.EditorForModel("EntityBase") 

このように、コントローラーは、EntityBaseビューへの1回限りの呼び出しであるデフォルトの編集ビューを返します。これは、そのことを行い、知識のない派生クラスのものをレンダリングするためにDerivedを呼び出します。

私はこれが目立たないと思ったが、うまくいかなかった。ビューコードでマークされているように、基本クラスビュー内でEditorForModelを呼び出し、派生クラスの名前をテンプレートとして指定すると、何も描画されません。私は、トップレベルの編集テンプレートでこのまったく同じコード行を呼び出すと、うまく動作することをテストしました。だから、MVCが好まない継承について何かがありますが、私は何が見えません。助けてください!

更新:代わりにEditorForの私はPartialを使用(およびEditorTemplatesフォルダから共有フォルダに対応するテンプレートを移動する)場合、私は期待通りに動作しますが、私はそれがない混乱だと思うので、それは素晴らしい解決策ではありませんEditorForテンプレートの命名規則に従ってください。

答えて

3

この状況でMVCは名前付きテンプレートを見つけることはできませんが、テンプレートの完全パスを指定すると、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のバグでなければならないと思います。 (私が時間を取れば、私はソースコードをチェックできると思う。)誰もこれを確認したりコメントしたりできますか?

+0

同じ問題が発生しました。素晴らしい回避策をありがとう。私はちょうどあきらめようとしていた: –

+0

それを聞いてうれしい!私は本当にこの髪を切り裂きました。 –

関連する問題