如何在编辑操作中使用 ViewModel?
Posted
技术标签:
【中文标题】如何在编辑操作中使用 ViewModel?【英文标题】:How to use ViewModels in Edit Action? 【发布时间】:2013-04-15 18:15:10 【问题描述】:我想养成使用ViewModels
的习惯。
过去我只在我的Create Actions
中使用过它们,而我从未想过如何在Edit Actions
中使用它们。我改用Domain Entities
。
假设我有以下内容:
使用Entity Framework Code First
POCO 类在域项目中
public class Person
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PersonId get; set;
public string Name get; set;
public string Website get; set;
public DateTime? Created get; set;
public DateTime? Updated get; set;
在我的数据项目中
抽象文件夹:
public interface IPersonRepository
IQueryable<Person> People get;
void SavePerson(Person person);
具体文件夹:
EfDb 类
public class EfDb : DbContext
public EfDb() : base("DefaultConnection")
public DbSet<Person> People get; set;
EfPersonRepository 类
#region Implementation of Person in IPersonRepository
public IQueryable<Person> People
get return _context.People;
public void SavePerson(Persona person)
if (person.PersonId == 0)
_context.People.Add(person);
else if (person.PersonId> 0)
var currentPerson = _context.People
.Single(a => a.PersonId== person.PersonId);
_context.Entry(currentPerson).CurrentValues.SetValues(person);
_context.SaveChanges();
#endregion
PersonCreateViewModel 在 WebUI Porject ViewModels 文件夹中
public class PersonCreateViewModel
[Required]
[Display(Name = "Name:")]
public string Name get; set;
[Display(Name = "Website:")]
public string Website get; set;
人员控制器和创建操作:
public class PersonController : Controller
private readonly IPersonRepository _dataSource;
public PersonController(IPersonRepository dataSource)
_dataSource = dataSource;
// GET: /Association/
public ActionResult Index()
return View(_dataSource.Associations);
// GET: /Person/Details/5
public ActionResult Details(int id)
return View();
// GET: /Person/Create
[HttpGet]
public ActionResult Create()
return View();
// POST: /Person/Create
[HttpPost]
public ActionResult Create(PersonCreateViewModel model)
if (ModelState.IsValid)
try
var Person = new Person
Name = Model.Name,
Website = model.Website,
Created = DateTime.UtcNow,
Updated = DateTime.UtcNow
;
_dataSource.SavePerson(person);
return RedirectToAction("Index", "Home");
catch
ModelState.AddModelError("", "Unable to save changes. ");
return View(model);
现在,除非我弄错了,否则我希望我的 PersonEditViewlModel
看起来与我的 PersonCreateViewlModel
完全一样。但我不知道如何在我的Edit
操作中使用它,前提是我还必须像在Create
操作中那样调用SavePerson(Person person)
。
注意:请不要推荐AutoMapper
或ValueInjecter
。
这是怎么做到的?
【问题讨论】:
【参考方案1】:它就像 create 一样,只是你需要记录 ID。
[HttpGet]
public ActionResult Edit(int id)
var personVm = _dataSource.People.Single(p => p.PersonId == id)
.Select(e => new PersonEditViewModel
e.PersonId = p.PersonId,
e.Name = p.Name,
e.Website = p.Website
...
);
return View(personVm);
[HttpPost]
public ActionResult Edit(PersonEditViewModel model)
if (ModelState.IsValid)
var person = _dataSource.People.Single(p => p.PersonId == model.PersonId);
person.Name = model.Name;
person.Website = model.Website;
...
_dataSource.EditPerson(person);
return RedirectToAction("Index", "Home");
return View(model);
编辑: 因此,您无需对编辑进行其他查询
public void EditPerson(Person person)
_context.Entry(person).State = EntityState.Modified;
_context.SaveChanges();
【讨论】:
如果你看看我的SavePerson()
,我确定它确实同时保存了新对象和编辑对象
@KomengeMwandila 你的编辑会做一个额外的查询。因此,要么将 PersonEditViewModel 传递给存储库,要么更改存储库之外的人员字段。
我对@987654324@ 进行了一些更改,因为我无法访问.Select()
,但现在一切似乎都正常了。另外,我不需要创建EditPerson(Person person)
,因为SavePerson(Person person)
已设置为处理您的EditPerson(Person person)
设置执行的操作。尽管如此,感谢您的帮助,非常感谢。以上是关于如何在编辑操作中使用 ViewModel?的主要内容,如果未能解决你的问题,请参考以下文章