Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.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 MVC在一个视图中创建具有相关对象的对象_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# ASP.NET MVC在一个视图中创建具有相关对象的对象

C# ASP.NET MVC在一个视图中创建具有相关对象的对象,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我是ASP.NET MVC新手,我想创建一个视图,在该视图中我可以创建一个新对象以及相关对象 例如:我有以下班级人员: public class Person { public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public virtual List<Address> Address

我是ASP.NET MVC新手,我想创建一个视图,在该视图中我可以创建一个新对象以及相关对象

例如:我有以下班级人员:

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual List<Address> Addresses { get; set; }
}
我想要实现的是拥有一个视图,用户可以在其中键入此人的数据以及该用户的任意数量的地址

我的第一个(简单)尝试只是提供一个映射到控制器方法的操作链接。此方法将Person对象作为参数,将Address对象添加到集合地址中,并返回一个新的创建视图(可能不太好,但这样做有效)。但是当我尝试添加第二个地址时,我注意到这个人的地址集合又是空的

对于这类问题有什么建议/最佳做法吗


谢谢

我建议您采用以下方法:

1.创建视图模型:

public class AddressViewModel
{ 
    public string City { get; set; }
    public string Street { get; set; }
}

public class PersonViewModel()
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public AddressViewModel AddressViewModelTemplate {get; set;}
    public Collection<AddressViewModel> Addresses {get; set;}
}
强类型视图中的:

@model PersonViewModel;
@using(Html.BeginForm())
{
    //Display textbox for Person properties here
    ....
    <div id="addressInfo" style:"dislpay:none">
        @Html.EditorFor(x => x.AddressViewModelTemplate)
    </div>
    ....
    <div id="AddressesWraper">
        <input id="btnAddAddress" type="button" value="Add new Address" />
    <div>
}
<script>
    $(document).ready(function(){
        $("#btnAddAddress").click(function(){
            $("#AddressesWraper").append("#addressInfo").html();
            refreshAddressNames();
        });
    });
    function refreshAddressNames(){
        /*Here you should name your addresses like this:
          name="AddressViewModel.Addresses[0].City"
          name="AddressViewModel.Addresses[0].Street"
          name="AddressViewModel.Addresses[1].City"
          name="AddressViewModel.Addresses[1].Street"
          ................................[2].City"
                                          [2].Street"

        If you want delete option, you have to mind that too and reorder the collection propely*/
    }
</script>
@model PersonViewModel;
@使用(Html.BeginForm())
{
//在此处显示人员属性的文本框
....
@EditorFor(x=>x.AddressViewModelTemplate)
....
}
$(文档).ready(函数(){
$(“#btnAddAddress”)。单击(函数(){
$(“#AddresssWraper”).append(“#addressInfo”).html();
刷新地址名();
});
});
函数refreshAddressNames(){
/*在这里,您应该这样命名您的地址:
name=“AddressViewModel.Addresses[0]。城市”
name=“AddressViewModel.Addresses[0]。街道”
name=“AddressViewModel.Addresses[1]。城市”
name=“AddressViewModel.Addresses[1]。街道”
[2].城市“
[2] "街"
如果您想要删除选项,您也必须记住这一点,并正确地重新排列集合*/
}

因此,您知道您的代码有问题,但您不打算实际向我们展示代码?中显示了一些用于向集合动态添加对象的选项,这似乎是比始终向控制器发送请求更好的解决方案,谢谢!
    @model AddressViewModel
    <div>
        <div>@Html.LabelFor(x => x.City)</div>
        <div>@Html.TextBoxFor(x => x.City)</div>
    </div>
    <div>
        <div>@Html.LabelFor(x => x.Street)</div>
        <div>@Html.TextBoxFor(x => x.Street)</div>
    </div>
@model PersonViewModel;
@using(Html.BeginForm())
{
    //Display textbox for Person properties here
    ....
    <div id="addressInfo" style:"dislpay:none">
        @Html.EditorFor(x => x.AddressViewModelTemplate)
    </div>
    ....
    <div id="AddressesWraper">
        <input id="btnAddAddress" type="button" value="Add new Address" />
    <div>
}
<script>
    $(document).ready(function(){
        $("#btnAddAddress").click(function(){
            $("#AddressesWraper").append("#addressInfo").html();
            refreshAddressNames();
        });
    });
    function refreshAddressNames(){
        /*Here you should name your addresses like this:
          name="AddressViewModel.Addresses[0].City"
          name="AddressViewModel.Addresses[0].Street"
          name="AddressViewModel.Addresses[1].City"
          name="AddressViewModel.Addresses[1].Street"
          ................................[2].City"
                                          [2].Street"

        If you want delete option, you have to mind that too and reorder the collection propely*/
    }
</script>