ASP.NET MVC2, сущности отношений LINQ-TO-SQL, список выбора, привязка модели

Скажем, у вас есть следующий сценарий:

  • Таблица: Страна; Столбцы: CountryID, CountryName
  • Таблица: состояние; Столбцы: StateID, StateName, CountryID (внешний ключ)
  • Таблица: Местность; Столбцы: LocalityID, LocalityName, StateID (внешний ключ)

В MVC приятно, что автоматически сгенерированные классы LINQ-TO-SQL отображают отношения ассоциации в коде, так что вы можете вызывать связанную внешнюю сущность, например, на мой взгляд, я могу иметь:

<% foreach (var locality in Model.Localities) { %>

    <tr>
        <td>
            <%: locality.LocalityName %>
        </td>
        <td>
            <%: locality.State.StateName %>
        </td>
        <td>
            <%: locality.State.Country.CountryName %>
        </td>
    </tr>

<% } %>

Это успешно отрисовывается, когда я просматриваю действие index.

Однако у меня возникли проблемы с действием Изменить. Вот код:

        <strong>Locality Name</strong>
        <div class="editor-field">
            <%: Html.TextBox("LocalityName", Model.Locality.LocalityName) %>
            <%: Html.ValidationMessage("LocalityName")%>
        </div>

        <strong>Country</strong>
        <div class="editor-field">
            <%= Html.DropDownList("CountryID", Model.CountriesDDL, "-- select --") %>
        </div>

        <strong>State</strong>
        <div class="editor-field">
            <%= Html.DropDownList("StateID", Model.StatesDDL, "-- select--") %>
            <%: Html.ValidationMessage("StateID")%>
        </div>

Сначала я получал ошибку проверки рядом с списком выбора состояний (для StateID), который сказал, например, "8 не является допустимым значением". Так что не обновляется.

После прочтения ряда сообщений ( например, этой) я понимаю, что существует проблема, связанная с базой данных, которая обновляет отношения путем установки идентификатора, и что решение, по-видимому, заключается в том, чтобы вместо этого установить ENTITY. (Между прочим, здесь также дается противоположный совет). Следуя этому совету, я смотрел на перегруженные функции Html.DropDownList(), чтобы установить "значение" элемента списка для самого объекта, в то время как для свойства "text" присвоено Object.Name - я не решил эту проблему еще. Но так как эта работа становится все более трудоемкой, я был бы очень признателен за совет специалиста.

Поэтому мои вопросы таковы: действительно ли это сработает, если я начну? И возможно ли заставить SelectList работать таким образом (и какие-либо предложения относительно того, как)?

Спасибо за ваше время,

Тим.

2 ответа

Решение

В целом также не очень хорошая идея передавать модель вашего домена в View (за исключением, возможно, в списке Views).

Лучше использовать (прокси) ViewModel, который является упрощенной версией модели вашего домена. Это немного больше работы, но работает как шарм.

Попробуйте поиграть с этим кодом, чтобы заполнить ваш список, он работает для меня. Здесь я работаю с продуктом.

           <%:Html.DropDownListFor(m => m.Id, new SelectList(Model.Categories, "Id", "Name", Model.Product.CategoryId, "-Select-")%>

Используйте DTO для отображения списка, как вещи. Объекты могут быть использованы для создания, обновления, удаления

Другие вопросы по тегам