0

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

我有一个包含 3 列的主表( Customer ): Cust_IDpart_IDDress_ID
我将有另一个名为Body的表,它有两列:part_IDdefaultValue
我还将有另一个名为Dress的表,其中包含三列:dress_IDpart_IDLOV

客户表将存储客户信息以及他们喜欢的每个零件的着装。
正文表将存储每个部分的默认值。
Dress table 将存储不同部分的可用连衣裙的价值列表。

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

在此处输入图像描述

我的预期观点如下: 在此处输入图像描述

4

3 回答 3

2

视图模型只包含视图所需的所有数据。而已。没有特殊的设计,也没有魔法。

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

这实际上是您的视图需求到类的简单 1:1 映射,以允许您的视图是强类型的。

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

您的视图模型可能看起来与您的数据模型非常相似(甚至相同),并且执行两次似乎需要额外的工作,而且确实如此......但是当您需要时,保持您的视图模型分开会得到回报变化。它还可以帮助您防止发生某些安全问题。

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

视图模型的概念真的很简单,我觉得你想多了。这只是视图需要的数据。就这样。它与您的数据模型无关,除非它恰好也看起来像它。

于 2013-09-03T03:22:14.950 回答
1

如果我理解正确

梳妆台和客户表 - 一对多关系

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

Body table 和 Dress table - 一对多关系

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

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")
}
于 2013-09-02T09:47:04.267 回答
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
}
于 2013-09-02T08:52:10.353 回答