2010-12-06 8 views
0

これはちょっと複雑で、私には負担がかかる。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の選択値述語が細かく、適切な値を設定しないにも関わらず、リストから最初の値が常に選択され

  1. は今、ドロップダウンリストには、細かい表示し、正しく装着されているが、 (デバッガで少なくとも)。

  2. テンプレートのHtml.Labelは、プロパティの適切なDisplayNameを返しますが、ドロップダウンリストを表示するためにViewDataを定義すると、ラベルは通常のプロパティ名(つまりCategoryではなくcategory_id)にリセットされます。

何がありますか?あなたはこの機能を達成するための「きれいな」方法を考えることができますか?

答えて

1

オールライト、誰の応答私の答えがありますので、多分それは誰かに重宝:

はViewDataをキーのあなたのプロパティ名を使用しないでください!それはビューモデルを使いこなすので、あなたの意見は混乱し、不思議な行動を起こします。

実際には、魔法の文字列を完全に混乱させるのは最高ですが、あなたが主張するのであれば、
ex.: ViewData[prop.PropertyName+"_list"]のようなものを使用してください。あなたの意見はすぐにうまくいくはずです。

関連する問題