EditorFor()用于复杂类型列表(MVC)

时间:2013-11-29 04:27:35

标签: c# asp.net-mvc asp.net-mvc-4 razor editorfor

我正在尝试为复杂类型的List创建一个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)

它将显示文本框中的第一个选项。但是,我想要实现的是在多文本输入中显示所有选项。

有什么想法吗?

4 个答案:

答案 0 :(得分:16)

只需在Shared/EditorTemplates/Option.cshtml

中创建一个视图即可
@model Option

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

并致电

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

EditorFor为你迭代收集。

答案 1 :(得分:15)

你几乎拥有它。

在此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 :(得分:0)

我碰到了同样的问题,我有不同的解决方案,但有点类似于hutchonoid。

所以第一部分是相同的,修改Option.cshtml如下:

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

在Item.cshtml中,我使用Html.Partial调用Option.cshtml,如下所示:

@Html.Partial("Option", model:Model.Options)

就我而言,我不必修改ItemViewModel类。 希望这可以成为这个问题的替代答案。 干杯!

答案 3 :(得分:-3)

使用 @hutchonoid 的回答,你应该在视图中调用模板:

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

而不是

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

请注意,Option.cshtml模板位于 Views\Item\EditorTemplates\Option.cshtmlView\Shared\EditorTemplates\Option.cshtml