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);
}