2012-02-09 16 views
1

私はコードの使用量を削減しようとしています。私は文字列とテキストエリアのためのstring.cshtmlとmultiline.cshtml EditorTemplateを持っています。彼らは一度使うだけで十分です。例えば、これは、(余分なHTMLなし)私のstring.cshtmlです:DropDownListの汎用EditorTemplate?

@Html.Label(ViewData.ModelMetadata.DisplayName) 

@Html.TextBox("", 
ViewData.TemplateInfo.FormattedModelValue, 
new { placeholder = ViewData.ModelMetadata.Watermark }) 

@if (ViewData.ModelMetadata.IsRequired) 
    { 
     @:<span class="required"></span> 
    } 
@Html.ValidationMessage("") 

それはほとんど同じ私のTextAreaのです。私がしたいことは、私のドロップダウンリストに似たEditorTemplateを作成することです。ような何か:

... 
@Html.DropDown("", ......) 
.... 

は、私は上記のテキストボックスのために括弧内のコードを使用してバリエーションを試してみましたが、私はそこに何が起こるのか、コード、私の実際のドロップダウンリストに基づいて、考え出す試してみました。私は運がなかった。

このようにして、[UIHint("TemplateName")]を使用するか、@Html.EditorFor(m => m.MyProperty, "TemplateName")のようにして呼び出すことができます。ここで

は私のDropDownListコントロールは、通常のビューで次のようになります。

... 
@Html.DropDownListFor 
(m => m.MyProperty, 
new SelectList(Model.MyPropertyList, 
"Value", "Text")) 
... 

上記のコードは、私の見解で罰金を動作し、何の解決策が存在しない場合、私はちょうどそれを再使用しておこう。しかし、私は作成したい他のドロップダウンリストを持っており、すべてのドロップダウンリストをテンプレートに入れて再利用したいと思っています。私はそれらをすべて統治するために、1つのドロップダウンリストEditorTemplateを持つ方が良いと思った。 ;)

答えて

3

ドロップダウンリストを生成するには、選択した値をバインドするスカラープロパティ(例ではMyProperty)とコレクションプロパティ(例ではMyPropertyList)の2つのプロパティが必要です。エディタテンプレートは単一のプロパティに適しています。したがって、これらの2つのプロパティを含むジェネリッククラスを定義してドロップダウンリストを定義し、このジェネリッククラスのエディタテンプレートを定義しない限り、現在のコードもうまく動作します。

+0

偉大な説明をありがとうございました。私はちょうど再使用のための他のフォームコントロールでテンプレートに私の作業コードを入れます。これらのテンプレートは、すでに@Html.EditorFor()を使用しています。これらは、String.cshtmlとMultilineText.cshtml EditorTemplatesを使用します。 – REMESQ

0

ない最善の解決策が、あなたの親ビュー(またはどこで呼ばれるべき今まで)に

@Html.DropDownList(ViewData.TemplateInfo.FormattedModelValue.ToString(), 
new SelectList(ViewData["GenericSelectionList"] as IList), 
ViewData["Id"].ToString(), ViewData["Name"].ToString()) 

、その後

@html.EditorFor(x=> Model.ScalarProperty, new {GenericSelectionList =YourList, Id ="IdProperty", Name ="NameProperty"})