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

C# 用于复杂类型(MVC)列表的EditorFor(),c#,asp.net-mvc,asp.net-mvc-4,razor,editorfor,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,Editorfor,我正在尝试为复杂类型的列表创建一个EditorFor()。具体来说,下面的“选项”应显示在一个多文本输入中,其中每个选项(字符串)位于新行中。但是,我只能在文本框中显示一个选项,而不是所有选项 我的视图模型和类: public class ItemViewModel { public int itemId { get; set; } [UIHint("Option")] public List<Option> Options { get; set; } }

我正在尝试为复杂类型的列表创建一个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\Option.cshtml

//Not sure how to dispay the options here
<textarea rows="4" cols="50">
Display Options
</textarea>
@Html.TextBoxFor(x => x.OptionText)
EditorTemplates\Option.cshtml

//Not sure how to dispay the options here
<textarea rows="4" cols="50">
Display Options
</textarea>
@Html.TextBoxFor(x => x.OptionText)
它将在文本框中显示第一个选项。但是,我再次尝试实现的是在多文本输入中显示所有选项

有什么想法吗?

你差不多有了

在此
EditorTemplates\Option.cshtml
中添加以下内容:

@model IEnumerable<Option>
@foreach(var option in Model)
{
   @Html.TextBoxFor(m => option.Text)
}
@model IEnumerable<Option>
@foreach(var option in Model)
{
   @Html.TextBoxFor(m => option.Text)
}
@Html.Partial("Option", 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; }
}
公共类ItemViewModel
{
公共项目视图模型()
{
选项=新列表();
}
公共int itemId{get;set;}
[UIHint(“选项”)]
公共列表选项{get;set;}
}
此构造函数初始化集合:

public ItemViewModel()
{
    Options = new List<Options>();
}
public ItemViewModel()
{
选项=新列表();
}

使用@hutchonoid的答案,您应该调用视图中的模板:

@Html.EditorFor(model => Model.Options)
而不是

@Html.EditorFor(model => model.Options)
请注意,
选项.cshtml
模板位于
Views\Item\EditorTemplates\Option.cshtml
View\Shared\EditorTemplates\Option.cshtml
只需在
Shared/EditorTemplates/Option.cshtml

@model Option

@Html.TextBoxFor(m => m.Text)
打电话

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

EditorFor为您迭代收集。

我遇到了相同的问题,我有不同的解决方案,但与hutchonoid有点类似

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

@model IEnumerable<Option>
@foreach(var option in Model)
{
   @Html.TextBoxFor(m => option.Text)
}
@model IEnumerable<Option>
@foreach(var option in Model)
{
   @Html.TextBoxFor(m => option.Text)
}
@Html.Partial("Option", model:Model.Options)
在我的例子中,我不需要修改ItemViewModel类。 希望这能成为这个问题的另一个答案。
干杯

我得到“Object reference not set to a instance of a Object.”,因为模型为空。您需要将模型引用放在顶部的视图中,即@Model itemViewModel我不确定我是否理解…My option.cshtml视图的顶部有Model IEnumerable。并且Item.cshtml的顶部有model.ItemViewModel。如果在初始加载时没有发送任何数据,则还需要初始化集合。请参阅以上我的最新问卷:您确实需要像这样将模型发送回控制器中的视图:public ActionResult Index(){ItemViewModel=new ItemViewModel();model.itemId=1;model.Options=new List(){new Option{Text=“one”},new Option{Text=“two”};return view(model);}不,您不想使用model属性,您希望为MVC提供一个表达式,MVC可以从中确定绑定视图模型的属性路径。