使用Razor为域模型的层次结构创建表单

时间:2014-02-25 10:59:19

标签: c# entity-framework razor asp.net-mvc-5

假设我有以下课程(您是否也可以考虑我的课程在该关系部分方面是否正确):

public class EFDbContext : DbContext
{
    public DbSet<Project> Projects { get; set; }
    public DbSet<Address> Addresses { get; set; } // *
    public DbSet<Country> Countries { get; set; } // *
    // Custom model builder bindings for * coz of the plural issue with EF
}

public class Project
{
    public int ProjectID { get; set; }
    public string Name { get ; set; }

    public int AddressID { get; set; } // Database relation column
    public Address Address { get ; set; }
}

public class Address
{
    public int AddressID { get; set; }
    public string Address1 { get ; set; }    
    public string Address2 { get ; set; }

    public int CountryID { get; set; } // Database relation column
    public Country Country { get ; set; }
}

public class Country
{    
    public int CountryID { get; set; }
    public string Name { get; set; }
}

我将如何为此做剃刀......

我的“创建项目”页面需要一个看起来像这样的表格......但这不正确吗?

@model Project

    <div class="form-group">
        @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Name)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Address, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Address)
        </div>
    </div>

所以我最终创建了一个Shared/EditorTemplates/Address.cshtml,然后构建了地址表单:

@model Address

    <div class="form-group">
        @Html.LabelFor(model => model.Address1, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Address1)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Address2, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Address2)
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Country, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Country)
        </div>
    </div>

最后是Country one ...哪个需要输入一个类型(所以有些自定义类添加到editorfor,你不能这样做,我做textbox) - Shared/EditorTemplates/Country.cshtml < / p>

@model Country

    <div class="form-group">
        @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.TextBox("", Model.Name.ToString(), new { @class = "countries typeahead" })
        </div>
    </div>

这看起来是否正确?我发现它非常压倒性和令人困惑(顺便说一下,我已经尝试了这个并且它不起作用......但如果我知道这是正确的方法,那么我可以朝这个方向继续前进)!

1 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。只需注意将EditorTemplates放置在项目结构中的位置以及如何引用它们。 MVC惯例并不总是以您希望的方式工作,例如当模型包含在列表中时,使用单个模型的编辑器模板。

我的一个建议是为传递给剃刀视图的模型使用完全独立的“视图模型”。您可以使用像automapper这样的东西在视图模型和实体框架模型(也称为数据模型)之间进行映射。为什么?随着时间的推移,你会发现他们需要不同的东西,例如:模型属性的mvc属性。