了解MVC ViewModel

时间:2013-09-02 08:09:29

标签: asp.net-mvc model viewmodel

我对这个MVC环境很陌生,看起来像是一个很好的做法,但是,在互联网上的所有调查结果之后,我不太明白如何将ViewModel应用到我的案例中。

我有一个包含3列的主表(客户): Cust_ID part_ID dress_ID 。<我将有另一个名为 Body 的表,它有两列: part_ID defaultValue
我还会有另一张名为连衣裙的表,其中有三列: dress_ID part_ID LOV

客户表格会为每个零件存储客户信息及其首选礼服 正文表将存储每个部分的默认值 连衣裙表将存储不同部件的可用着装的价值列表。

在我看来,我会根据正文表中的数据提供一些下拉列表,并在下拉列表中显示相应的值列表供我的客户选择。我应该如何通过实现viewmodel来实际设计我的解决方案?任何帮助将非常感谢。
下面显示我的数据库样本数据:

enter image description here

我的预期观点如下: enter image description here

3 个答案:

答案 0 :(得分:2)

视图模型只包含您的视图所需的所有数据。而已。没有特别的设计或魔法。

如果您的网页上有10个表单字段,则视图模型中将有10个映射到它的属性。您可能还有隐藏字段(例如Id)或支持数据之类的内容,例如下拉列表的集合。

这是一个简单的1:1的视图要求映射到类,以允许您的视图强类型。

在控制器中,您可以通过某种方式在数据模型和视图模型之间进行映射。您可以使用AutoMapper之类的框架来执行此操作,或者您可以编写自定义代码来执行此映射。无论如何,您只需从GET上的数据模型中复制视图所需的任何数据,然后在POST上将结果映射回数据模型并保存更改。

您的视图模型可能与您的数据模型看起来非常相似(甚至完全相同),这样做可能看起来像额外的工作两次,而且它是......但是当您保持视图模型分离时需要做出改变。它还可以帮助您防止发生某些安全问题。

如何构建View模型取决于您希望如何使用数据。您可以简单地展平数据模型,并将几个表格转换为一个类。或者您可以创建一组在视图中迭代的对象。这一切都取决于你想做什么。

视图模型的概念非常简单,我认为你已经过度思考了。它只是视图所需的数据。就这样。它与您的数据模型无关,除非它恰好也是如此。

答案 1 :(得分:1)

如果我理解正确

  

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

     

正文表和客户表 - 一对多关系

     

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

如果是这样,你的模型设计将如下所示。

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 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")
}

答案 2 :(得分:0)

  

当您有许多不同的值传递给视图时,您可以获得相同的灵活性   快速添加新条目,或重命名现有条目,成为你最大的敌人。你留在你的   拥有跟踪项目名称和值;你没有得到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

您可以使用AutoMapper自动将数据从模型传输到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
}