在MVC 6模型中绑定复杂对象的集合

时间:2016-05-13 20:14:46

标签: asp.net-mvc model model-binding

问候所有人
我在将数据发送到Controller时绑定复杂对象 FullAddress 查看

        <fieldset>
            <legend>Address</legend>
            <div class="form-group">
                <div class="col-md-7">
                    <textarea asp-for="FullAddress.AddressLine" class="form-control"></textarea>
                    <span asp-validation-for="FullAddress.AddressLine" class="text-danger" />
                </div>
                <div class="row col-md-3 col-md-offset-1" >
                    <input asp-for="FullAddress.IsPrimary" checked="checked" type="radio" value="true" class="col-md-1" style="width:5px;" />
                    <span class="col-md-4">primary</span>
                    <input type="button" value="+" class="btn btn-sm btn-default col-md-1" style="width:9px;" onclick="addAddressTxtField()">
                </div>
            </div>
            <div id="addresses-to-add"></div>
        </fieldset>

模型

    public class CreatePersonViewModel
{

    public AddressVm FullAddress { get; set; }

}

public class AddressVm {
    public string AddressLine { get; set; }
    public bool IsPrimary { get; set; }
}

到目前为止,每个人都很开心。但是,突然之间,我使用Javascript将类似的html代码添加到我的div中。
JS:

function addAddressTxtField() {
var html = '<div class="form-group" style="display:none"><div class="col-md-7">'
+ '<textarea class="form-control" name=FullAddress.AddressLine"></textarea>'
+ '<span class="text-danger field-validation-valid" data-valmsg-replace="true" data-valmsg-for="FullAddress.AddressLine"></span>'
+'</div><div class="row col-md-3 col-md-offset-1">'
+ '<input class="col-md-1" type="radio" name="FullAddress.IsPrimary" data-val-required="The IsPrimary field is required." data-val="true" style="width:5px;" value="true">'
+'<span class="col-md-4">primary</span>'
+ '<input class="btn btn-sm btn-default col-md-1" type="button" style="width:9px;" value="-" onclick="removeTextfield(this)"></div></div>' 

var newAddressTxtfield = $('#addresses-to-add').append(html);
newAddressTxtfield.children().show('slow'); };

这导致用户输入有两个textareas和两个单选按钮。对?因此我被迫使用我的AddressVm模型的集合。像这个

这样的东西
public IList<AddressVm> AddressList { get; set; }

所以这并不适合我的代码,因为我不能使用for循环来分配字段。当然,我可以做丑陋的事情 - 硬编码括号和索引。 像这样:

<textarea asp-for="AddressList[0].AddressLine" class="form-control"></textarea>
<span asp-validation-for="AddressList[0].AddressLine" class="text-danger" />

稍后创建js变量,每次用户添加新输入字段时都会迭代,但这不是我想要的。理想情况下,我想使用IEnumerable或任何同样&#34; clean&#34;。你推荐什么是我的问题的最佳解决方案?也许我应该使用 IDictionary 或创建自定义模型绑定?任何帮助将不胜感激。

0 个答案:

没有答案