Asp.net mvc 如何为两个相关实体创建视图和视图模型

Asp.net mvc 如何为两个相关实体创建视图和视图模型,asp.net-mvc,razor,Asp.net Mvc,Razor,我有两个实体: 1) 学生 2)地址 public class Student { Public Int StudentId { get; set; } Public String FullName { get; set; } Public virtual IList<Address> Addresses { get; set; } } public class Address { Public Int AddressId { get; set;

我有两个实体: 1) 学生 2)地址

public class Student 
{
    Public Int StudentId { get; set; }
    Public String FullName { get; set; }

    Public virtual IList<Address> Addresses { get; set; }
}

public class Address
{
    Public Int AddressId { get; set; }
    Public Int StudentId { get; set; }
    Public String FullAddress { get; set; }

    Public virtual Student Student { get; set; }
}
公共班级学生
{
公共Int StudentId{get;set;}
公共字符串全名{get;set;}
公共虚拟IList地址{get;set;}
}
公共课堂演讲
{
Public Int AddressId{get;set;}
公共Int StudentId{get;set;}
公共字符串完整地址{get;set;}
公共虚拟学生学生{get;set;}
}
每个学生可以有零个或多个地址

public class Student 
{
    Public Int StudentId { get; set; }
    Public String FullName { get; set; }

    Public virtual IList<Address> Addresses { get; set; }
}

public class Address
{
    Public Int AddressId { get; set; }
    Public Int StudentId { get; set; }
    Public String FullAddress { get; set; }

    Public virtual Student Student { get; set; }
}
我想为这两个实体创建一个视图。我知道必须创建一个视图模型。这是视图模型

public class StudentViewModel
{
    Public Int StudentId { get; set; }
    Public String FullName { get; set; }
    public Address AddAddressModel { get; set; }

    Public virtual IList<Address> Addresses { get; set; }
}
公共类学生视图模型
{
公共Int StudentId{get;set;}
公共字符串全名{get;set;}
公共地址AddAddressModel{get;set;}
公共虚拟IList地址{get;set;}
}
我为StudentViewModel创建了一个视图。这是StudentViewModel:

@model MyProject.Models.StudentViewModel

@{
    ViewBag.Title = "Create";
 }

 @using (Html.BeginForm ())
 {
     @Html.ValidationSummary(true)

    <fieldset>

        <div class="editor-label">
            @Html.LabelFor(model => model.FullName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.FullName)
            @Html.ValidationMessageFor(model => model.FullName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.AddAddressModel.FullAddress)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.AddAddressModel.FullAddres)
            @Html.ValidationMessageFor(model => model.AddAddressModel.FullAddres)
        </div>

        <button id="add">add address to list</button>

        <input type="submit" value="save in database" />        
</fieldset>
@model MyProject.Models.StudentViewModel
@{
ViewBag.Title=“创建”;
}
@使用(Html.BeginForm())
{
@Html.ValidationSummary(true)
@LabelFor(model=>model.FullName)
@EditorFor(model=>model.FullName)
@Html.ValidationMessageFor(model=>model.FullName)
@LabelFor(model=>model.AddAddressModel.FullAddress)
@EditorFor(model=>model.AddAddressModel.FullAddres)
@Html.ValidationMessageFor(model=>model.AddAddressModel.FullAddres)
将地址添加到列表中

请告诉我如何在StudentViewModel的Addresses属性中逐个添加一个或多个地址,并在此操作后向用户显示。最后,当我单击“保存在数据库中”时button student及其地址必须插入数据库。

我以前提交过嵌套子实体,但这总是通过API调用完成的,表单在提交之前被序列化为JSON对象

因为您实际上只需要多个
FullAddress
值,所以您可以相应地更改模型和视图(未测试):

型号:

public class StudentViewModel
{
    public int StudentId { get; set; }
    public string FullName { get; set; }
    public string[] Addresses { get; set; }
}
查看:

public class StudentViewModel
{
    public int StudentId { get; set; }
    public string FullName { get; set; }
    public string[] Addresses { get; set; }
}
在您的视图中,当您单击“添加”按钮时,请确保(通过JavaScript)以如下方式结束:

<textarea name="Addresses[]">Some Address 1</textarea>
<textarea name="Addresses[]">Some Address 2</textarea>
etc...
某个地址1
一些地址2
等
您可以尝试使用:

@EditorFor(m => model.Addresses)

这将为您的地址模型创建模板

谢谢CornéM,但我想使用我的模型。因为我想将此模型扩展到复杂模型,如:工厂及其分支。请告诉我有关第一个解决方案的更多信息:在表单提交之前将表单序列化为JSON对象。您可以使用thi将表单序列化为复杂JSON对象s插件:。然后,您可以简单地使用
$.post()
将对象发送到脚本。我已经在复杂模型中多次使用此解决方案,但它尚未失败。谢谢,但更大的问题是如何在单击“保存在数据库中”之前保存地址按钮并在单击后将此数据插入数据库。是当您发布表单时,您应该在yourviewmodel.Addresses.AddressId或yourviewmodel.Addresses.FullAddress下获取值。我如何在提交表单之前将地址添加到列表中?jQuery对我有帮助吗?在表单的sumbit之后,在创建操作方法中,我想通过写入来访问学生地址模型.地址