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

时间:2013-02-22 12:57:54

标签: 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; }
    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; }
}

我为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>

请告诉我如何在StudentViewModel的地址属性中添加一个或多个地址,并在此操作后显示给用户。最后当我点击“保存在数据库中”按钮时,学生和他的地址必须插入数据库。

2 个答案:

答案 0 :(得分:1)

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

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

<强>型号:

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 :(得分:0)

您可以尝试使用:

@EditorFor(m => model.Addresses)

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