EditorFor () для списка сложного типа (MVC)

Я пытаюсь создать EditorFor () для списка сложного типа. В частности, «Параметры» ниже должны отображаться в одном мультитекстовом вводе, где каждый параметр (строка) находится в новой строке. Однако я могу отображать только один параметр в текстовом поле, а не все параметры ....

Моя модель просмотра и класс:

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)

Он отобразит первый вариант в текстовом поле. Но я снова пытаюсь отобразить все параметры в многотекстовом вводе.

Любые идеи?


person piris    schedule 29.11.2013    source источник


Ответы (4)


Вы почти получили это.

В это EditorTemplates\Option.cshtml добавить следующее:

@model IEnumerable<Option>
@foreach(var option in Model)
{
   @Html.TextBoxFor(m => option.Text)
}

Затем назовите его так:

@Html.EditorFor(model => model.Options)

Если вы не заполняете свои параметры при первоначальном получении, вам нужно будет добавить это в свой класс 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>();
}
person hutchonoid    schedule 29.11.2013
comment
Я получаю ссылку на объект, не относящуюся к экземпляру объекта. потому что модель нулевая. - person piris; 29.11.2013
comment
Вам нужно поместить ссылку на свою модель в представление вверху, то есть @model ItemViewModel - person hutchonoid; 29.11.2013
comment
Я не уверен, что понимаю ... В моем представлении option.cshtml вверху указана модель IEnumerable ‹Option›. И у Item.cshtml есть model.ItemViewModel вверху. - person piris; 29.11.2013
comment
Вам также необходимо инициализировать коллекцию, если вы не отправляете ее при начальной загрузке. Пожалуйста, смотрите мою обновленную цитату выше. : D - person hutchonoid; 29.11.2013
comment
Вам действительно нужно отправить модель обратно в представление, подобное этому в вашем контроллере: public ActionResult Index () {ItemViewModel model = new ItemViewModel (); model.itemId = 1; model.Options = new List ‹Option› () {новый вариант {Text = one}, новый вариант {Text = two}}; return View (модель); } - person hutchonoid; 29.11.2013
comment
Все еще работаю над этим :( Я связываю эти данные с помощью AJAX с Kendo UI Wrappers, и похоже, что на их стороне есть ограничение. Не уверен, что еще думать. - person piris; 29.11.2013
comment
у меня не работает - выдает ошибку, как только я пытаюсь добавить @model IEnumerable ‹Option› - person user3281466; 20.04.2015
comment
@ user3281466 Извините, это было еще в 2013 году - person hutchonoid; 20.04.2015
comment
Он выдает ссылку NULL в (параметр var в модели). Я знаю, что он пуст, но мне нужно создать элементы для этого списка, поэтому мне нужно только отображать входные данные для него. Как это сделать? - person Nerf; 20.06.2016
comment
@Nerf Я бы использовал DisplayTemplates вместо того, чтобы просто отображать данные, то есть DisplayTemplates\Option.cshtml, затем @Html.DisplayFor(model => model.Options) - person hutchonoid; 20.06.2016
comment
@Nerf Вы исправили проблему? У меня сейчас эта проблема. - person Asger Vestbjerg; 10.08.2016

Просто создайте представление в Shared/EditorTemplates/Option.cshtml

@model Option

@Html.TextBoxFor(m => m.Text)

И позвони

@Html.EditorFor(model => model.Options)

EditorFor выполняет итерацию по коллекции за вас.

person Antonio Correia    schedule 12.02.2016

Я столкнулся с той же проблемой, и у меня есть другое решение, но немного похожее с 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. Надеюсь, это может быть альтернативным ответом на эту проблему. Ваше здоровье!

person Sambalado    schedule 06.03.2017

Используя ответ @hutchonoid, вы должны вызвать шаблон в представлении:

@Html.EditorFor(model => Model.Options)

вместо

@Html.EditorFor(model => model.Options)

и обратите внимание, шаблон Option.cshtml находится в Views\Item\EditorTemplates\Option.cshtml или View\Shared\EditorTemplates\Option.cshtml

person Willy    schedule 29.04.2015
comment
Нет, вы не хотите использовать свойство Model, вы хотите дать MVC выражение, из которого он сможет определять путь к свойствам для привязки модели представления. - person billy; 16.05.2016