Как использовать ASP.NET MVC 3 с Razor, каков наиболее эффективный способ добавить ICollection в представление Create? - PullRequest
5 голосов
/ 29 августа 2011

Я использую Entity Framework Code First для создания своей базы данных, поэтому у меня есть объект, определенный следующим образом:

public class Band
{
    public int Id { get; set; }
    [Required(ErrorMessage = "You must enter a name of this band.")]
    public string Name { get; set; }
    // ...
    public virtual ICollection<Genre> Genres { get; set; }
}

Теперь я смотрю на представление создания для этого, и стандартные леса не добавляют Жанры в мою форму, что, исходя из прошлого опыта, соответствует ожиданиям.

Глядя в Интернете, я нашел Использование ASP.NET MVC v2 EditorFor и DisplayFor с IEnumerable Общие типы , которые, кажется, наиболее близки к тому, что я хочу, но, похоже, не имеют смысла с Razor и, возможно, MVC 3, для ASP.NET MVC 3 Пользовательский шаблон отображения с UIHint - для цикла требуется? .

В настоящее время я добавил список жанров в ViewBag, а затем перебрал этот список в моем представлении создания:

@{
    List<Genre> genreList = ViewBag.Genres as List<Genre>;
}
// ...
<ul>
@for (int i = 0; i < genreList.Count; i++)
{
    <li><input type="checkbox" name="Genres" id="Genre@(i.ToString())" value="@genreList[i].Name" /> @Html.Label("Genre" + i.ToString(), genreList[i].Name)</li>
}
</ul>

За исключением случаев, когда еще не обрабатываются случаи, когда у пользователя отключен JavaScript, и необходимо повторно установить флажки, и фактически обновляя базу данных этой информацией, он выводит жанры так, как мне хотелось бы.

Но это не совсем правильно, учитывая, насколько хорош MVC 3.

Так какой же самый эффективный способ справиться с этим в MVC 3?

1 Ответ

5 голосов
/ 29 августа 2011

Я не отправляю списки в свой просмотр через ViewBag, вместо этого я использую свою модель представления для этого.Например, я сделал что-то вроде этого:

У меня есть такой EditorTemplate:

@model IceCream.ViewModels.Toppings.ToppingsViewModel
<div>
   @Html.HiddenFor(x => x.Id)
   @Html.TextBoxFor(x =x> x.Name, new { @readonly="readonly"})
   @Html.CheckBoxFor(x => x.IsChecked)
</div>

, который я положил в свою папку Views \ IceCream \ EditorTemplates.Я использую это для отображения некоторого html, чтобы позволить пользователю «проверить» любой конкретный топпинг.

Тогда в моем представлении у меня есть что-то вроде этого:

@HtmlEditorFor(model => model.Toppings)

, и это будет использовать тот результат, что мой EditorTemplate будет использоваться для каждого из начинок в свойстве Toppings моей модели представления.

А потом у меня есть модель представления, которая, помимо прочего, включает коллекцию Toppings:

public IEnumerable<ToppingsViewModel> Toppings { get; set; }

В моем контроллере, среди прочего, я получаю начинки (однакоЯ делаю это в моем случае) и устанавливаю свойство моей viewmodel для этой коллекции начинок.В случае редактирования, где начинки могли быть выбраны ранее, я установил элемент IsChecked в TopingsViewModel, и он установит флажки для соответствующих флажков.

Выполнение этого способа обеспечило правильную привязку модели, такчто когда пользователь проверял несколько начинок, базовые элементы в коллекции отражали эти выборы.Хорошо сработало для меня, надеюсь, это полезно для вас.

...