我对这个MVC环境很陌生,看起来像是一个很好的做法,但是,在互联网上的所有调查结果之后,我不太明白如何将ViewModel应用到我的案例中。
我有一个包含3列的主表(客户): Cust_ID , part_ID 和 dress_ID 。<我将有另一个名为 Body 的表,它有两列: part_ID 和 defaultValue 。
我还会有另一张名为连衣裙的表,其中有三列: dress_ID , part_ID 和 LOV
客户表格会为每个零件存储客户信息及其首选礼服 正文表将存储每个部分的默认值 连衣裙表将存储不同部件的可用着装的价值列表。
在我看来,我会根据正文表中的数据提供一些下拉列表,并在下拉列表中显示相应的值列表供我的客户选择。我应该如何通过实现viewmodel来实际设计我的解决方案?任何帮助将非常感谢。
下面显示我的数据库样本数据:
我的预期观点如下:
答案 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
}