我是Asp.net MVC的新手,可以对View模型的运作方式进行一些澄清。
根据我的理解,View模型仅用于将必要的字段从域模型公开到视图。我发现难以理解的是,域模型通过Dbset链接到Db。因此,对我来说,当使用域模型将数据发布到控制器时,这些数据可以进入Db。
从我看过的View模型示例中,它们没有被Dbset引用。那么发布到View模型的数据如何进入数据库。 EF是否只匹配View模型中的字段与域模型匹配的字段?
感谢您的帮助
答案 0 :(得分:1)
正如Jonathan所说,AutoMapper将帮助您将ViewModel实体映射到您的域模型。这是一个例子:
在您的视图中,您使用视图模型( CreateGroupVM ):
@model X.X.Areas.Group.Models.CreateGroupVM
@using (Html.BeginForm(null,null, FormMethod.Post, new { @class="form-horizontal", role="form"}))
{
@Html.ValidationSummary()
@Html.AntiForgeryToken()
@Html.LabelFor(model => model.Title, new { @class = "col-lg-4 control-label" })
@Html.TextBoxFor(model => model.Title, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Title)
@Html.LabelFor(model => model.Description, new { @class = "col-lg-4 control-label" })
@Html.TextBoxFor(model => model.Description, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.Description)
@Html.LabelFor(model => model.CategoryId, new { @class = "col-lg-4 control-label" })
@Html.DropDownListFor(x => x.CategoryId, Model.Categories)
@Html.ValidationMessageFor(model => model.CategoryId)
<div class="form-group">
<div class="col-lg-offset-4 col-lg-8">
<button type="submit" class="btn-u btn-u-blue">Create</button>
</div>
</div>
}
ViewModel(CreateGroupVM.cs): 请注意我们如何传递类别列表 - 如果您严格使用域模型,则无法执行此操作,因为您无法传递组模型中的类别列表。这为我们在视图中提供了强类型帮助程序,并且没有使用ViewBag。
public class CreateGroupVM
{
[Required]
public string Title { get; set; }
public string Description { get; set; }
[DisplayName("Category")]
public int CategoryId { get; set; }
public IEnumerable<SelectListItem> Categories { get; set; }
}
域模型(Group.cs):
public class Group
{
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public int CategoryId { get; set; }
public int CreatorUserId { get; set; }
public bool Deleted { get; set; }
}
在您的HttpPost创建操作中 - 您让AutoMapper执行映射,然后保存到数据库。请注意,默认情况下,AutoMapper将映射具有相同名称的字段。您可以阅读https://github.com/AutoMapper/AutoMapper/wiki/Getting-started以开始使用AutoMapper。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateGroupVM vm)
{
if (ModelState.IsValid)
{
var group = new InterestGroup();
Mapper.Map(vm, group); // Let AutoMapper do the work
db.Groups.Add(group);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(vm);
}
答案 1 :(得分:0)
视图模型与数据库无关。您需要创建一个新的域模型,并使用视图模型中的数据填充它,以便将其保存到数据库中。当然,必须这样做非常烦人,有人创建了AutoMapper来处理它。
使用automapper,您可以将视图模型中的属性与域模型中的属性进行匹配,然后根据需要将它们添加到数据库中。