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 для отображения списка, как вещи. Объекты могут быть использованы для создания, обновления, удаления