Передача SelectList через ViewData шаблонам редактора - отображается неправильно - PullRequest
0 голосов
/ 06 декабря 2010

Это немного сложно, так что терпите меня.

Допустим, у меня есть пример действия редактирования контроллера, определенного как:

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"].

Я также определил DisplayName атрибуты метаданных для каждого свойства моего класса Node.

Теперь выпадающие списки отображаются нормально и заполняются правильно, но:

  1. Первое значение из списка всегда выбирается, даже если предикат выбранного значения SelectList в порядке и устанавливает правильное значение (по крайней мере, в отладчике).
  2. Html.Label в шаблоне возвращает правильное DisplayName для свойств, но когда я определяю ViewData для них, чтобы отобразить раскрывающийся список, метка сбрасывается на обычное имя свойства (т. Е. category_id вместо Category ).

Что дает? Можете ли вы придумать какой-нибудь «аккуратный» способ реализации этой функциональности?

1 Ответ

1 голос
/ 07 декабря 2010

Хорошо, никто не отвечает, так что мой ответ, может быть, кому-то пригодится:

Не используйте имена своих свойств для ключей ViewData! Это портит модель представления, поэтому ваши представления запутываются и начинают вести себя странно.

На самом деле, лучше всего избегать беспорядка волшебных струн, но если вы настаиваете, просто используйте что-то вроде
ex.: ViewData[prop.PropertyName+"_list"]. Теперь ваши взгляды будут хорошими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...