【问题标题】:How do I update a view model from an edit page in MVC3?如何从 MVC3 中的编辑页面更新视图模型?
【发布时间】:2012-06-27 01:43:47
【问题描述】:

我将三个模型组合在一起创建一个视图模型,我希望能够在单击“编辑”时编辑该视图模型。我找不到一个直接的例子来说明它是如何工作的(在任何地方)。

我不确定我是否走在正确的道路上。我能够通过数据获得视图。此时,我无法保存它。

任何帮助将不胜感激。

谢谢!

型号:

    public class Person
{
    [Key]
    public int Id { get; set; }

    [MaxLength(20)]
    [Required(ErrorMessage = "First name is required.")]
    public string FirstName { get; set; }

    [MaxLength(20)]
    [Required(ErrorMessage = "Last name is required.")]
    public string LastName { get; set; }
    [MaxLength(40)]
    [Required(ErrorMessage = "Email is required.")]
    public string Email { get; set; }
    [MaxLength(20)]
    [DataType(DataType.PhoneNumber)]
    public string Phone { get; set; }

    public bool Active { get; set; }
}


    public class ClientContact
{
    [Key]
    [ForeignKey("Person")]
    public int ClientPersonId { get; set; }
    public int ClientId { get; set; }
    [MaxLength(40)]
    public string Title { get; set; }

    public Person Person { get; set; }
    [ForeignKey("ClientId")]
    public Client Client { get; set; }
}

    public class Client
{
    [Key]
    public int ClientId { get; set; }
    public string Name { get; set; }
    public bool Active {get;set;}

}

查看模型:

    public class ClientContactViewModel
{

    private SimplexDB db = new SimplexDB();


    public ClientContactViewModel()
    { 

    }


    public ClientContactViewModel(int id)
    {
        ClientPersonId = id;
        InitializeClientContact();
    }

    public int ClientPersonId { get; set; }


    [Display(Name = "First Name")]
    public string FirstName { get; set; }
    [Display(Name = " Last Name")]
    public string LastName { get; set; }
    [Display(Name = "Title")]
    public string Title { get; set; }
    [Display(Name = "Email Address")]
    public string Email { get; set; }
    [Display(Name = "Phone")]
    public string Phone { get; set; }
    [Display(Name = "Client Name")]
    public int ClientId { get; set; }


    public SelectList Clients
    {
        get
        {
            return new SelectList(db.Clients, "ClientId", "Name");

        }
    }

    private void InitializeClientContact()
    {
        var contact = db.ClientPersons.Include("Person").Where(x => x.ClientPersonId == ClientPersonId).SingleOrDefault();
        if (contact != null)
        {
            FirstName = contact.Person.FirstName;
            LastName = contact.Person.LastName;
            Title = contact.Title;
            Email = contact.Person.Email;
            Phone = contact.Person.Phone;
            ClientId = contact.ClientId;

        }
    }



}

控制器:

                public class ClientContactController : Controller
    {
        private database db = new database();

//
        // GET: /ClientContact/Edit/5

        public ActionResult Edit(int id)
        {
            return View(new ClientContactViewModel(id));
        }

        //
        // POST: /ClientContact/Edit/5

        [HttpPost]
        public ActionResult Edit(ClientContactViewModel model)
        {
            if (ModelState.IsValid)
            {
                db.Entry(model).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(model);
        }
}

我在 db.Entry(model).State 处收到错误...“实体类型 ClientContactViewModel 不是当前上下文模型的一部分。”

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 viewmodel


    【解决方案1】:

    您的 ViewModel 不是实体。您应该将 ViewModel 映射到您的实体,然后将实体的状态设置为已修改。

    基本上,这意味着您应该使用视图模型值设置实体值。你可以使用AutoMapper或者手动处理:

        [HttpPost]
        public ActionResult Edit(ClientContactViewModel model)
        {
            if (ModelState.IsValid)
            {
                ClientContact contact = db.ClientPersons.Include("Person")
                                        .Where(x => x.ClientPersonId == model.ClientPersonId)
                                        .SingleOrDefault();
                contact.FirstName = model.FirstName;
                // etc
                db.Entry(contact).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(model);
        }
    

    请参阅http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/,了解在 MVC 中使用 ViewModel 的绝佳方法。

    另外,我强烈建议不要在您的 ViewModel 中进行任何数据访问。在您的 Controller 中执行此操作,或者更好的是,在您的 Controller 使用的存储库中执行此操作。模型绑定不能很好地与具有逻辑的模型配合使用(即它们不应包含简单的 get/set 属性以外的任何内容)。

    【讨论】:

    • 我该怎么做呢?抱歉,我是新手。
    • 明确一点,我是否需要根据您上面编写的代码更新我的视图模型?感谢您的帮助。
    • 没问题,很高兴我能帮上忙。
    【解决方案2】:

    您需要在 GET 操作中将模型的属性移动到视图模型。在 POST 操作中,从数据库中获取原始模型,使用视图模型中的数据更新模型,然后保存更改。您的模型本质上是数据库中表的表示。您的视图模型就是屏幕上显示的内容。

    [HttpPost] 
        public ActionResult Edit(ClientContactViewModel model) 
        { 
            if (ModelState.IsValid) 
            { 
    
               var client = db.Client.Where(c => c.Id = model.ClientPersonId);
               client.FirstName = model.FirstName;
    
               ...etc through all your properties and other models...
    
    
                db.Entry(model).State = EntityState.Modified; 
                db.SaveChanges(); 
                return RedirectToAction("Index"); 
            } 
            return View(model); 
        } 
    

    有更巧妙的方法可以做到这一点,但这代表了没有抽象的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多