如何在编辑操作中使用 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)

注意:请不要推荐AutoMapperValueInjecter

这是怎么做到的?

【问题讨论】:

【参考方案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 传递给存储库,要么更改存储库之外的人员字段。 我对@9​​87654324@ 进行了一些更改,因为我无法访问.Select(),但现在一切似乎都正常了。另外,我不需要创建EditPerson(Person person),因为SavePerson(Person person) 已设置为处理您的EditPerson(Person person) 设置执行的操作。尽管如此,感谢您的帮助,非常感谢。

以上是关于如何在编辑操作中使用 ViewModel?的主要内容,如果未能解决你的问题,请参考以下文章

wpf mvvm下viewmodel中对view进行操作

如何将 UI Dispatcher 传递给 ViewModel

如何在ViewModel中访问View中的控件

如何在自定义View里使用ViewModel

WPF MVVM 从 VIEW MODEL 获取父级

iOS 中使用 MVVM,复杂的 Cell 的 ViewModel 应该如何去写