По сути, у меня есть класс сущности (Article), и одна статья может принадлежать к n категориям. Здесь можно ожидать поле для категорий (скажем, ICollection), но база данных построена не так, и я не могу изменить модель Entity Framework.
Когда категория выбирается в представлении, пользователь должен выбрать свойство (список строк от 1 до 10. Это будет выглядеть так:
Category Option
===============================
[x] Category 1 |---------|v|
[x] Category 2 |---------|v|
[x] Category 3 |---------|v|
[x] Category 4 |---------|v|
[x] - checkbox
|---|v| - dropdown list
Однако я думаю, что, возможно, я мог бы создать ViewModel для этого конкретного случая. Я думал что-то вроде
namespace Models.ViewModels
{
public class ArticleViewModel
{
public Article Article { get; set; }
public ICollection<Category> Categories { get; set; }
public ArticleViewModel()
{
Categories = new List<Category>();
}
}
}
Однако, когда я отправляю форму в контроллер, ArticleViewModel и все его внутренние компоненты равны нулю. Я не уверен почему.
Само представление довольно простое, оно будет иметь две отдельные формы: одну для изменения сведений о статье и одну для назначения категорий статье.
Как новичку в asp.net mvc, мне немного трудно обдумать эту проблему.
Какой подход вы бы порекомендовали?
Обновление: добавлен код для представления.
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Models.ViewModels.ArticleViewModel>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Modify article: <%= Model.Article.Title %>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm()) {%>
<%= Html.ValidationSummary(true) %>
<fieldset>
<legend>Properties</legend>
<div class="property">
<span>
<%= Html.LabelFor(model => Model.Article.Title) %>
<%= Html.TextBoxFor(model => Model.Article.Title) %>
<%= Html.ValidationMessageFor(model => Model.Article.Title) %>
</span>
</div>
<div class="property">
<span>
<%= Html.LabelFor(model => Model.Article.Type) %>
<%= Html.TextBoxFor(model => Model.Article.Type) %>
<%= Html.ValidationMessageFor(model => Model.Article.Type) %>
</span>
</div>
[continued...]
<div>
<%= Html.HiddenFor(model => Model.Article.Id) %>
<input type="submit" value="Save" />
</div>
</fieldset>
<% } %>
</asp:Content>
Маршрутизация выглядит так:
routes.MapRoute(
"Articles",
"Articles/{action}/{id}",
new { controller = "Articles", action = "Edit" }
);