编辑可变长度列表ASP.NET MVC 3

时间:2013-06-11 19:25:55

标签: c# asp.net-mvc-3 razor jquery-templates editorfor

我的EditorFor有问题。我有以下型号

  public class AddNewItemViewModel : BaseViewModel
{
   ...

    public List<ItemDetailViewModel> ItemDetails { get; set; }

    public ItemDetailViewModel ItemDetailTemplate { get; set; }
}

public class ItemDetailViewModel
{
    //Item details 
    [Required(ErrorMessageResourceName = "BarCodeValidator", ErrorMessageResourceType = typeof(AddNewItem))]
    [StringLength(50, ErrorMessageResourceName = "BarCodeLenghtValidator", ErrorMessageResourceType = typeof(AddNewItem))]
    public string BarCode { get; set; }
    ...
}

项目详细信息已映射到EditorFor,这正常工作我的问题是我想通过ItemDetails向视图中添加新的jquery。所以我使用了Jquery Template

<script id="distanceSuggestionTemplate" type="text/x-jquery-tmpl">
@Html.EditorFor(m => Model.ItemDetailTemplate)
</script>  

运行此

的Jquery代码
$("#addNewItemDetail").click(function () {
    $('#distanceSuggestionTemplate').tmpl({ Index: 1 }).appendTo('#itemTemplate');
});

这里的问题是我无法将新添加的html映射到List<ItemDetailViewModel> ItemDetails所以我可以在发布到控制器时使用现有的新项目获取该项目。有关如何解决该问题的任何建议?

1 个答案:

答案 0 :(得分:0)

如果您将EditorFor应用于列表,则会生成以下内容:

<input id="ItemDetails_0__Barcode" name="ItemDetails[0].Barcode"/>
<input id="ItemDetails_1__Barcode" name="ItemDetails[1].Barcode"/>
...

但使用@Html.EditorFor(m => Model.ItemDetailTemplate)的模板很可能是:

<input id="Barcode" name="Barcode"/>

因此无法映射到您的列表。

可能的解决方法是使用具有正确列表索引的模板,如:。

  `<input id="ItemDetails_n__Barcode" name="ItemDetails[n].Barcode"/>`

但它似乎不是一个优雅的解决方案。也许您需要重新考虑添加项目的方式(例如使用jQuery和ajax而不是ASP.NET MVC编辑器)