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