View Models如何链接到数据库?

时间:2013-10-28 23:16:45

标签: asp.net-mvc asp.net-mvc-4

我是Asp.net MVC的新手,可以对View模型的运作方式进行一些澄清。

根据我的理解,View模型仅用于将必要的字段从域模型公开到视图。我发现难以理解的是,域模型通过Dbset链接到Db。因此,对我来说,当使用域模型将数据发布到控制器时,这些数据可以进入Db。

从我看过的View模型示例中,它们没有被Dbset引用。那么发布到View模型的数据如何进入数据库。 EF是否只匹配View模型中的字段与域模型匹配的字段?

感谢您的帮助

2 个答案:

答案 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,您可以将视图模型中的属性与域模型中的属性进行匹配,然后根据需要将它们添加到数据库中。