Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET MVC4模型绑定器中使用动态嵌套集合绑定ViewModels_C#_Jquery_Asp.net Mvc 4_Dynamic_Model Binding - Fatal编程技术网

C# 在ASP.NET MVC4模型绑定器中使用动态嵌套集合绑定ViewModels

C# 在ASP.NET MVC4模型绑定器中使用动态嵌套集合绑定ViewModels,c#,jquery,asp.net-mvc-4,dynamic,model-binding,C#,Jquery,Asp.net Mvc 4,Dynamic,Model Binding,我正在构建一个简单的web应用程序,用户可以对管理员设置的主题进行投票。每个主题可以有两个或多个选项,例如“是”或“否”风格的投票主题将有两个选项,其中“肯辛顿最好的餐厅是什么?”的投票主题可以有许多选项 以下是我当前的ViewModel: public class NewTopicVM { [Required] [Display(Name = "Topic Title")] public string TopicTitle { get; set; } [Req

我正在构建一个简单的web应用程序,用户可以对管理员设置的主题进行投票。每个主题可以有两个或多个选项,例如“是”或“否”风格的投票主题将有两个选项,其中“肯辛顿最好的餐厅是什么?”的投票主题可以有许多选项

以下是我当前的ViewModel:

public class NewTopicVM
{
    [Required]
    [Display(Name = "Topic Title")]
    public string TopicTitle { get; set; }

    [Required]
    [Display(Name = "Topic Description")]
    public string TopicDescription { get; set; }

    [Display(Name = "Topic Image")]
    public byte[] TopicImage { get; set; }
    public List<NewOptionVM> TopicOptions { get; set; }
}

public class NewOptionVM
{
    public string OptTitle { get; set; }
    public string OptDescription { get; set; }
}
我从Index=1开始,因为我已经显示了两个选项。以下是一个屏幕截图:

前两个框绑定良好,但单击[Add Option]按钮后动态添加的第三个框没有绑定


我做错了什么?我已经确保了索引是正确的,但它不起作用:(

使用for循环遍历列表,并使用index和editorfor

// other fields as usual

For(int i = 0; i < Model.TopicOptions.Count; i++)
{
    @Html.EditorFor(m => m.TopicOptions[i].OptTitle)
    @Html.EditorFor(m => m.TopicOptions[i].OptDescription)
}
现在,如果动态添加新项,可以对操作进行ajax调用,以返回一个列表,最后一项为新对象。该操作应返回索引,然后绑定将正常,因为名称和id将自动生成。(还可以将所有内容发送到服务器以删除)


这取决于您是想在javascript中手动处理id/name字段,还是从服务器自动处理id/name字段。

谢谢Iko,您的代码适用于非动态输入,但不适用于动态输入,请参阅更新的Q。没关系,我犯了一个愚蠢的错误。输入上的My name属性需要采用以下格式>
TopicOptions(2)OptTitle < /代码> OK,好的,你已经知道了。使用一个对象列表需要为每个项目提供唯一的索引。它会有点棘手,因为你必须确保增加增量索引,所以动态地添加更多的项目。如果你删除中间的一个项目,你还必须调整索引(IIrC)。。谢谢,我没有想过在删除一个输入时修复索引。有没有简单的方法可以做到这一点?不幸的是,没有简单的方法可以做到这一点,你必须用JavaScript处理它们(解析名称和ID中的索引并减少它们等)或者将整个列表传递给服务器并从列表中删除已删除的项。如果对象很复杂,则在服务器上执行此操作(从列表中删除一项)可能比在JS中解析列表中的所有项及其属性更容易。
// other fields as usual

For(int i = 0; i < Model.TopicOptions.Count; i++)
{
    @Html.EditorFor(m => m.TopicOptions[i].OptTitle)
    @Html.EditorFor(m => m.TopicOptions[i].OptDescription)
}
for(...)
    @Html.Partial("_NewOption", new ViewDataDictionary { { "index", i } })