【问题标题】:Automapper and ViewModels and Posting Updates back to databaseAutomapper 和 ViewModel 以及将更新发布回数据库
【发布时间】:2013-05-07 13:28:23
【问题描述】:

我一直在读到您应该使用 ViewModels(和 AutoMapper) - 所以这是我的初步步骤。

我只是在寻找一些保证,即我正在将我的模型映射到我的视图模型,并且在发回时,我正在从返回的视图模型中正确更新数据库记录:

    //
    // GET: /Customer/EditPartial
    public ActionResult EditPartial(int id)
    {
        var customerVM = db.Customers.Where(x => x.UserName == User.Identity.Name && x.CustomerId == id).FirstOrDefault();
        AutoMapper.Mapper.CreateMap<Customer, CustomerViewModel>();
        CustomerViewModel customer = AutoMapper.Mapper.Map<Customer, CustomerViewModel>(customerVM);
        return PartialView("CustomerPartial2", customer);
    }

    //
    // POST: /Customer/EditPartial
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult EditPartial(CustomerViewModel customerviewmodel)
    {
        if (ModelState.IsValid)
        {
            Customer customer = db.Customers.Where(x => x.UserName == User.Identity.Name && x.CustomerId == customerviewmodel.CustomerId).FirstOrDefault();
            if (customer == null)
            {
                return HttpNotFound();
            }
            customer.CustomerName = customerviewmodel.CustomerName;
            customer.Email = customerviewmodel.Email;
            db.Entry(customer).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return PartialView("CustomerPartial2", customerviewmodel);
    }

那么,我的 Get 设置 Automapper 是否正确?

我从 viewmodel 更新 CustomerName 和 Email 的方式是否正确,或者是否有更简单的方式再次使用 AutoMapper?

谢谢,

标记

【问题讨论】:

  • 设置看起来不错,除了变量的命名(customerVM 对应于 Customer 实体,customer 对应于视图模型)。您还可以在 post 方法中使用 automapper 将 vm 映射回客户实体。
  • 您遇到问题了吗?如果没有,这应该张贴在codereview.stackexchange.com 上。
  • 谢谢 - 没问题 - 只是我不确定如何在 POST 中使用 AutoMapper - 我这样做的方式似乎根本没有使用 AutoMapper。

标签: asp.net-mvc asp.net-mvc-3 entity-framework automapper


【解决方案1】:

如果您正确完成映射,则说明您使用正确。无论如何,AutoMapper 都可以用于获取和发布。它在生活中的唯一目的是将您的一个类映射到另一个类(在您的特定情况下,域模型到视图模型,反之亦然)。如果映射是正确的(在调试器中),你就可以了。如果没有,请告诉我们您遇到了什么问题。

如果您不确定如何使用它,请参阅这篇文章:来自 Visual Studio 杂志的Simplify Your Projections with AutoMapper

这是另一个特定于 ASP.NET MVC 的:Using Automapper with ASP.NET MVC application

谢谢。

【讨论】:

    【解决方案2】:

    由于 AutoMapper 旨在简洁,我认为这段代码会更优雅:

    //
        // POST: /Customer/EditPartial
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult EditPartial(CustomerViewModel customerviewmodel)
        {
            if (ModelState.IsValid)
            {
                Customer customer = db.Customers.Where(x => x.UserName == User.Identity.Name && x.CustomerId == customerviewmodel.CustomerId).FirstOrDefault();
                if (customer == null)
                {
                    return HttpNotFound();
                }
                Mapper.CreateMap<CustomerViewModel , Customer>();
                Mapper.Map(customerviewmodel, customer);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
    
            return PartialView("CustomerPartial2", customerviewmodel);
        }
    

    在您的代码中没有太多手动属性分配,但在某些情况下您可能需要使用您的方法输入很多内容。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 2021-04-29
      • 1970-01-01
      • 2015-12-25
      • 2012-10-19
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多