EditorFor() для списка сложного типа (MVC)
Я пытаюсь создать EditorFor() для списка сложного типа. В частности, "Опции" ниже должны отображаться в одном вложенном входе, где каждая опция (строка) находится в новой строке. Тем не менее, я могу отображать только один вариант в текстовом поле, а не во всех вариантах....
Модель и класс My View:
public class ItemViewModel
{
public int itemId { get; set; }
[UIHint("Option")]
public List<Option> Options { get; set; }
}
public class Option
{
public string Text { get; set; }
}
Мои шаблоны редактора:
EditorTemplates\Item.cshtml
@model ItemViewModel
@Html.EditorFor(model => model.Options)
EditorTemplates\Option.cshtml
//Not sure how to dispay the options here
<textarea rows="4" cols="50">
Display Options
</textarea>
Если я обновляю свои EditorTemplates до:
EditorTemplates\Item.cshtml
@model ItemViewModel
@Html.EditorFor(model => model.Options[0])
EditorTemplates\Option.cshtml
@Html.TextBoxFor(x => x.OptionText)
Он отобразит первый вариант в текстовом поле. Но опять же я пытаюсь показать все параметры в многоточечном входе.
Любые идеи?
Ответы
Ответ 1
У вас его почти нет.
В этом EditorTemplates\Option.cshtml
добавьте следующее:
@model IEnumerable<Option>
@foreach(var option in Model)
{
@Html.TextBoxFor(m => option.Text)
}
Затем вызовите его в своем представлении следующим образом:
@Html.EditorFor(model => model.Options)
Если вы не заполняете свои параметры в исходном get, вам нужно добавить это в свой класс ItemViewModel:
public class ItemViewModel
{
public ItemViewModel()
{
Options = new List<Option>();
}
public int itemId { get; set; }
[UIHint("Option")]
public List<Option> Options { get; set; }
}
Этот конструктор инициализирует коллекцию:
public ItemViewModel()
{
Options = new List<Options>();
}
Ответ 2
Просто создайте представление в Shared/EditorTemplates/Option.cshtml
@model Option
@Html.TextBoxFor(m => m.Text)
И вызовите
@Html.EditorFor(model => model.Options)
EditorFor итерации по коллекции для вас.
Ответ 3
Я столкнулся с той же проблемой, и у меня есть другое решение, но немного похожее на hutchonoid.
Итак, первая часть такая же, измените параметр Option.cshtml следующим образом:
@model IEnumerable<Option>
@foreach(var option in Model)
{
@Html.TextBoxFor(m => option.Text)
}
И в Item.cshtml я вызываю Option.cshtml с помощью Html.Partial, например:
@Html.Partial("Option", model:Model.Options)
И в моем случае мне не нужно изменять класс ItemViewModel.
Надеюсь, это может быть альтернативным ответом на эту проблему.
Ура!
Ответ 4
Используя ответ @hutchonoid, вы должны вызвать шаблон в поле зрения:
@Html.EditorFor(model => Model.Options)
вместо
@Html.EditorFor(model => Model.Options)
и, пожалуйста, обратите внимание, что шаблон Option.cshtml
находится в
Views\Item\EditorTemplates\Option.cshtml
или View\Shared\EditorTemplates\Option.cshtml