2010-12-06 23 views
0

这有点复杂,所以请耐心等待。将SelectList通过ViewData传递给编辑器模板 - 未正确显示

比方说,我有一个控制器的编辑动作的示例等被定义:

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); 

该视图模板,像这样:

<%@ 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> 
<% } %> 

那么,什么模板的作用是显示每个存在ViewData["property_name"]的房产的下拉列表。

我还为我的Node类的每个属性定义了DisplayName元数据属性。

现在,下拉列表显示效果细腻,并正在正确填充,但:

  1. 从列表中的第一个值始终处于选中状态,尽管选择列表的选择的值谓词是罚款,并设置一个适当的值(至少在调试器中)。
  2. 模板中的Html.Label会为属性返回正确的DisplayName,但是当我为它们定义ViewData以显示下拉列表时,该标签将重置为正常的属性名称(即category_id而不是Category)。

是什么给出的?你能想到任何“整洁”的方式来完成这个功能吗?

回答

1

还好吧,没有人接听所以有我的答案,也许它派上用场的人:

不要使用你的财产名字ViewData的钥匙!它与视图模型混淆起来,所以你的观点会变得混乱,并开始表现得很奇怪。

事实上,最好避免魔法串完全混乱,但如果你坚持,只需使用类似
ex.: ViewData[prop.PropertyName+"_list"]。你的观点现在会好起来的。

相关问题