3

私は Asp.net MVC を初めて使用するので、View モデルがどのように機能するかについて明確にすることができます。

私の理解では、ビュー モデルは、ドメイン モデルから必要なフィールドのみをビューに公開するために使用されます。私が理解しにくいのは、ドメイン モデルが Dbset を介して Db にリンクされていることです。したがって、データがドメイン モデルを使用してコントローラにポストされると、このデータが Db への道を見つけることができるということは理にかなっています。

私が見た View モデルの例から、それらは Dbset によって参照されていません。では、ビュー モデルに投稿されたデータはどのようにしてデータベースに到達するのでしょうか。EF は、ビュー モデルのフィールドをドメイン モデルのフィールドに一致させるだけですか?

ご協力いただきありがとうございます

4

2 に答える 2

1

Jonathan が述べたように、AutoMapper は ViewModel エンティティを Domain モデルにマッピングするのに役立ちます。以下に例を示します。

ビューでは、ビュー モデル ( 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 Create Action で、AutoMapper にマッピングを実行させてから、DB に保存します。デフォルトでは、AutoMapper は同じ名前のフィールドをマップすることに注意してください。AutoMapperの使用を開始するには、https://github.com/AutoMapper/AutoMapper/wiki/Getting-startedを参照してください。

[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);
    }
于 2013-10-29T04:58:21.277 に答える
0

ビュー モデルはデータベースに関連付けられていません。データベースに保存するには、新しいドメイン モデルを作成し、ビュー モデルからのデータを入力する必要があります。もちろん、それをしなければならないのは非常に面倒で、誰かがそれを処理するためにAutoMapperを作成しました。

automapper を使用すると、ビュー モデルのプロパティをドメイン モデルのプロパティに一致させ、必要に応じてそれらをデータベースに追加できます。

于 2013-10-28T23:24:26.327 に答える