Asp.net mvc 对MVC视图模型的理解

Asp.net mvc 对MVC视图模型的理解,asp.net-mvc,model,viewmodel,Asp.net Mvc,Model,Viewmodel,我对MVC环境非常陌生,似乎拥有ViewModel是一个很好的实践,但是,在互联网上的所有发现之后,我不太明白如何将ViewModel应用到我的案例中。 我有一个主表(Customer),有三列:Cust\u ID、part\u ID和dress\u ID我还有一个名为Body的表,它有两列:part\u ID和defaultValue我还有一个名为Dress的表,它有三列:Dress\u ID、part\u ID和LOV 客户表将存储客户信息以及每个零件的首选服装。 主体表格将存储每个零件的默

我对MVC环境非常陌生,似乎拥有ViewModel是一个很好的实践,但是,在互联网上的所有发现之后,我不太明白如何将ViewModel应用到我的案例中。

我有一个主表(Customer),有三列:Cust\u IDpart\u IDdress\u ID
我还有一个名为Body的表,它有两列:part\u IDdefaultValue
我还有一个名为Dress的表,它有三列:Dress\u IDpart\u IDLOV

客户表将存储客户信息以及每个零件的首选服装。
主体表格将存储每个零件的默认值。
连衣裙表格将存储不同部位可用连衣裙的值列表

在我看来,根据Body表中的数据,我将有许多下拉列表,并在下拉列表中显示相应的值列表,供客户选择。我应该如何通过实现viewmodel来设计解决方案?任何帮助都将不胜感激
下面显示了我的数据库示例数据:

我的预期观点如下:

当您有几十个不同的值要传递给一个视图时,同样的灵活性允许您 快速添加一个新条目,或者重命名一个现有条目,这将成为你最大的敌人 自己跟踪项目名称和值;您得不到Microsoft IntelliSense和编译器的帮助。 处理软件复杂性的唯一行之有效的方法是通过适当的设计。因此,为每个视图定义对象模型有助于跟踪该视图真正需要的内容。我建议你定义一个 添加到应用程序中的每个视图的视图模型类

--Dino Esposito的“编程Microsoft ASP.NET MVC”

一个简单的ViewModel可能是这样的

public class FooViewModel
{
    [Required]  
    public SelectList BarLov1 { get; set; }
    public SelectList BarLov2 { get; set; }
    public SelectList BarLov3 { get; set; }

    // Other data
}
ViewModel中的每个属性都可以使用适当的
ValidationAttribute

可以使用自动将数据从模型传输到ViewModel,反之亦然

更新:

public class CustomerViewModel
{
    [Required]
    public SelectList Parts { get; set; }

    [Required]
    public SelectList Dresses { get; set; }

    [Required]
    public string CustomerName { get; set; }

    public string CustomerID { get; set; }

    // Other data
}
public ActionResult Create()
        {
            List<Body> bodies = new List<Body>()
            { 
                new Body{PartID=1,DefaultValue="Default1"},
                new Body {PartID=2,DefaultValue="Default2"},
                new Body {PartID=3,DefaultValue="Default3"}
            };

            Dress dress = new Dress();
            dress.parts = bodies;

            return View(dress);
        }
@model Mvc4Test.Models.Dress

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

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

    <fieldset>
        <legend>Dress</legend>

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

            @Html.DropDownListFor(x => x.parts, new SelectList(Model.parts,"PartID","DefaultValue"))
            @Html.ValidationMessageFor(model => model.PartID)
        </div>
        <br /><br />
        <div class="editor-label">
            @Html.LabelFor(model => model.LOV)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LOV)
            @Html.ValidationMessageFor(model => model.LOV)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
当您有几十个不同的值要传递给一个视图时,同样的灵活性允许您 快速添加一个新条目,或者重命名一个现有条目,这将成为你最大的敌人 自己跟踪项目名称和值;您得不到Microsoft IntelliSense和编译器的帮助。 处理软件复杂性的唯一行之有效的方法是通过适当的设计。因此,为每个视图定义对象模型有助于跟踪该视图真正需要的内容。我建议你定义一个 添加到应用程序中的每个视图的视图模型类

--Dino Esposito的“编程Microsoft ASP.NET MVC”

一个简单的ViewModel可能是这样的

public class FooViewModel
{
    [Required]  
    public SelectList BarLov1 { get; set; }
    public SelectList BarLov2 { get; set; }
    public SelectList BarLov3 { get; set; }

    // Other data
}
ViewModel中的每个属性都可以使用适当的
ValidationAttribute

可以使用自动将数据从模型传输到ViewModel,反之亦然

更新:

public class CustomerViewModel
{
    [Required]
    public SelectList Parts { get; set; }

    [Required]
    public SelectList Dresses { get; set; }

    [Required]
    public string CustomerName { get; set; }

    public string CustomerID { get; set; }

    // Other data
}
public ActionResult Create()
        {
            List<Body> bodies = new List<Body>()
            { 
                new Body{PartID=1,DefaultValue="Default1"},
                new Body {PartID=2,DefaultValue="Default2"},
                new Body {PartID=3,DefaultValue="Default3"}
            };

            Dress dress = new Dress();
            dress.parts = bodies;

            return View(dress);
        }
@model Mvc4Test.Models.Dress

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

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

    <fieldset>
        <legend>Dress</legend>

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

            @Html.DropDownListFor(x => x.parts, new SelectList(Model.parts,"PartID","DefaultValue"))
            @Html.ValidationMessageFor(model => model.PartID)
        </div>
        <br /><br />
        <div class="editor-label">
            @Html.LabelFor(model => model.LOV)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LOV)
            @Html.ValidationMessageFor(model => model.LOV)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

如果我理解正确的话

服装表和客户表-一对多关系

Body表和Customer表-一对多关系

身体表和服装表-一对多关系

如果是这样的话,你的模型设计如下

public class Customer
    {
        public int CustomerID { get; set; }
        public List<Body> parts { get; set; }
        public List<Dress> dresses { get; set; }

        public Customer()
        {
            this.parts = new List<Body>();
            this.dresses = new List<Dress>();
        }


    }

    public class Body
    {
        public int PartID { get; set; }
        public string DefaultValue { get; set; }
        public Customer customer { get; set; }
        public Dress dress { get; set; }
    }

    public class Dress
    {
        public int DressID { get; set; }
        public int PartID { get; set; }
        public string LOV { get; set; }

        public Customer customer { get; set; }

        public List<Body> parts { get; set; }

        public Dress()
        {
            this.parts = new List<Body>();
        }
    }
公共类客户
{
public int CustomerID{get;set;}
公共列表部分{get;set;}
公共列表{get;set;}
公众客户()
{
this.parts=新列表();
this.treats=新列表();
}
}
公共阶级团体
{
公共int PartID{get;set;}
公共字符串DefaultValue{get;set;}
公共客户客户{get;set;}
公共礼服{获得;设置;}
}
公务舱服装
{
公共ID{get;set;}
公共int PartID{get;set;}
公共字符串LOV{get;set;}
公共客户客户{get;set;}
公共列表部分{get;set;}
公共着装()
{
this.parts=新列表();
}
}
为服装模型创建视图实现示例:

public class CustomerViewModel
{
    [Required]
    public SelectList Parts { get; set; }

    [Required]
    public SelectList Dresses { get; set; }

    [Required]
    public string CustomerName { get; set; }

    public string CustomerID { get; set; }

    // Other data
}
public ActionResult Create()
        {
            List<Body> bodies = new List<Body>()
            { 
                new Body{PartID=1,DefaultValue="Default1"},
                new Body {PartID=2,DefaultValue="Default2"},
                new Body {PartID=3,DefaultValue="Default3"}
            };

            Dress dress = new Dress();
            dress.parts = bodies;

            return View(dress);
        }
@model Mvc4Test.Models.Dress

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

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

    <fieldset>
        <legend>Dress</legend>

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

            @Html.DropDownListFor(x => x.parts, new SelectList(Model.parts,"PartID","DefaultValue"))
            @Html.ValidationMessageFor(model => model.PartID)
        </div>
        <br /><br />
        <div class="editor-label">
            @Html.LabelFor(model => model.LOV)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LOV)
            @Html.ValidationMessageFor(model => model.LOV)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
控制器:

public class CustomerViewModel
{
    [Required]
    public SelectList Parts { get; set; }

    [Required]
    public SelectList Dresses { get; set; }

    [Required]
    public string CustomerName { get; set; }

    public string CustomerID { get; set; }

    // Other data
}
public ActionResult Create()
        {
            List<Body> bodies = new List<Body>()
            { 
                new Body{PartID=1,DefaultValue="Default1"},
                new Body {PartID=2,DefaultValue="Default2"},
                new Body {PartID=3,DefaultValue="Default3"}
            };

            Dress dress = new Dress();
            dress.parts = bodies;

            return View(dress);
        }
@model Mvc4Test.Models.Dress

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

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

    <fieldset>
        <legend>Dress</legend>

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

            @Html.DropDownListFor(x => x.parts, new SelectList(Model.parts,"PartID","DefaultValue"))
            @Html.ValidationMessageFor(model => model.PartID)
        </div>
        <br /><br />
        <div class="editor-label">
            @Html.LabelFor(model => model.LOV)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LOV)
            @Html.ValidationMessageFor(model => model.LOV)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
public ActionResult Create()
{
列表正文=新列表()
{ 
新主体{PartID=1,DefaultValue=“Default1”},
新主体{PartID=2,DefaultValue=“Default2”},
新主体{PartID=3,DefaultValue=“Default3”}
};
连衣裙=新连衣裙();
衣服。部分=身体;
返回视图(连衣裙);
}
查看:

public class CustomerViewModel
{
    [Required]
    public SelectList Parts { get; set; }

    [Required]
    public SelectList Dresses { get; set; }

    [Required]
    public string CustomerName { get; set; }

    public string CustomerID { get; set; }

    // Other data
}
public ActionResult Create()
        {
            List<Body> bodies = new List<Body>()
            { 
                new Body{PartID=1,DefaultValue="Default1"},
                new Body {PartID=2,DefaultValue="Default2"},
                new Body {PartID=3,DefaultValue="Default3"}
            };

            Dress dress = new Dress();
            dress.parts = bodies;

            return View(dress);
        }
@model Mvc4Test.Models.Dress

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

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

    <fieldset>
        <legend>Dress</legend>

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

            @Html.DropDownListFor(x => x.parts, new SelectList(Model.parts,"PartID","DefaultValue"))
            @Html.ValidationMessageFor(model => model.PartID)
        </div>
        <br /><br />
        <div class="editor-label">
            @Html.LabelFor(model => model.LOV)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LOV)
            @Html.ValidationMessageFor(model => model.LOV)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
@model Mvc4Test.Models.Dress
@{
ViewBag.Title=“创建”;
}
创造
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
连衣裙
@LabelFor(model=>model.PartID)
@DropDownListFor(x=>x.parts,新选择列表(Model.parts,“PartID”,“DefaultValue”))
@Html.ValidationMessageFor(model=>model.PartID)


@LabelFor(model=>model.LOV) @EditorFor(model=>model.LOV) @Html.ValidationMessageFor(model=>model.LOV)

} @ActionLink(“返回列表”、“索引”) @节脚本{ @Scripts.Render(“~/bundles/jqueryval”) }
如果我理解正确

服装表和客户表-一对多关系

Body表和Customer表-一对多关系

身体表和服装表-一对多关系

如果是这样,你的模型设计会