これはちょっと複雑で、私には負担がかかる。ViewDataを介してSelectListをエディタテンプレートに渡す - 正しく表示されない
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Myapp.Models.Node>" %>
<% if (ViewData.TemplateInfo.TemplateDepth > 1)
{ %>
<%= ViewData.ModelMetadata.SimpleDisplayText %>
<% }
else
{ %>
<table cellpadding="0" cellspacing="0" border="0">
<% foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm)))
{ %>
<% if (prop.HideSurroundingHtml)
{ %>
<%= Html.Editor(prop.PropertyName) %>
<% }
else
{ %>
<tr>
<td>
<div class="editor-label" style="text-align: right;">
<%= prop.IsRequired ? "*" : ""%>
<%= Html.Label(prop.PropertyName)%>
</div>
</td>
<td>
<div class="editor-field">
<% if (ViewData.Keys.Contains(prop.PropertyName))
{
if ((ViewData[prop.PropertyName]).GetType().Name == "SelectList")
{ %>
<%= Html.DropDownList(prop.PropertyName, (SelectList)ViewData[prop.PropertyName])%>
<% }
else
{ %>
<%= Html.Editor(prop.PropertyName)%>
<% } %>
<% }
else
{ %>
<%= Html.Editor(prop.PropertyName)%>
<% } %>
<%= Html.ValidationMessage(prop.PropertyName, "*")%>
</div>
</td>
</tr>
<% } %>
<% } %>
</table>
<% } %>
だから、何テンプレートはありませんが表示されている:ビューはそうのようにテンプレート化され
Node nd = _repo.getNode(id);
List<Category> ac = new List<Category>();
ac.AddRange(_repo.getCategories());
SelectList acl = new SelectList(ac, "category_id", "category_name", ac.Where(cat => cat.category_id == nd.category_id).First());
ViewData["category_id"] = acl;
return View(nd);
:
のは、私は、コントローラのeditアクションの例を得たように定義したとしましょうViewData["property_name"]
が存在するすべてのプロパティのドロップダウンリスト。
また、NodeクラスのすべてのプロパティにDisplayName
メタデータ属性を定義しました。 SelectListの選択値述語が細かく、適切な値を設定しないにも関わらず、リストから最初の値が常に選択され
- :
は今、ドロップダウンリストには、細かい表示し、正しく装着されているが、 (デバッガで少なくとも)。
- テンプレートのHtml.Labelは、プロパティの適切なDisplayNameを返しますが、ドロップダウンリストを表示するためにViewDataを定義すると、ラベルは通常のプロパティ名(つまり
Category
ではなくcategory_id
)にリセットされます。
何がありますか?あなたはこの機能を達成するための「きれいな」方法を考えることができますか?