2012-01-13 10 views
9

Đây là mã điều khiển của tôi, hoạt động 100% khi tôi cần nó. Tuy nhiên phương thức POST không sử dụng AutoMapper và điều đó không ổn. Làm thế nào tôi có thể sử dụng AutoMapper trong phương pháp hành động này?Sử dụng AutoMapper trong phương thức Chỉnh sửa hành động trong ứng dụng MVC3

Tôi đang sử dụng Entity Framework 4 với Mẫu Kho lưu trữ để truy cập dữ liệu.

public ActionResult Edit(int id) 
{ 
    Product product = _productRepository.FindProduct(id); 
    var model = Mapper.Map<Product, ProductModel>(product); 
    return View(model); 
} 

[HttpPost] 
public ActionResult Edit(ProductModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     Product product = _productRepository.FindProduct(model.ProductId); 

     product.Name = model.Name; 
     product.Description = model.Description; 
     product.UnitPrice = model.UnitPrice; 

     _productRepository.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 

    return View(model); 
} 

Nếu tôi sử dụng AutoMapper, tham chiếu khung thực thể bị mất và dữ liệu không tồn tại trong cơ sở dữ liệu.

[HttpPost] 
public ActionResult Edit(ProductModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     Product product = _productRepository.FindProduct(model.ProductId); 
     product = Mapper.Map<ProductModel, Product>(model); 

     _productRepository.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 

    return View(model); 
} 

Tôi đoán điều này gây ra hàm Mapper.Map trả về một đối tượng Product mới và vì lý do đó, không có tham chiếu đến biểu đồ khung thực thể đang được lưu giữ. Bạn đề nghị lựa chọn thay thế nào?

+0

Nó không rõ ràng vấn đề bạn đang gặp phải là gì. Bạn nói rằng phương thức POST của bạn không sử dụng Automapper, nhưng tôi không thấy bất kỳ mã Automapper nào trong phương thức '[HttpPost]' của bạn. –

+0

có thể bạn không đăng lại điều đúng? –

+0

Không chắc chắn ông có nghĩa là tự động Robert, nghĩ rằng ông có nghĩa là "modelbinder" nhưng tôi không chắc chắn 100% –

Trả lời

13

Tôi nghĩ rằng bạn chỉ làm

Product product = _productRepository.FindProduct(model.ProductId); 
Mapper.Map(model, product); 
_productRepository.SaveChanges(); 

bạn cũng có thể muốn kiểm tra xem bạn có một sản phẩm không null đầu tiên, và cũng có người dùng được phép thay đổi sản phẩm mà ....

+0

Dang, slick! Công việc này như một cái duyên vậy. Cảm ơn bạn! –

+0

Chính xác của nó, Thực ra chúng ta phải tạo Bản đồ để Nhận và Đăng Phương pháp Chỉnh sửa **, để Nhận Tên miền: Mô hình Miền Để Ánh xạ ViewModel và Đăng Bài của nó: ViewModel To Domain Model Mappings, kiểm tra [this] (http://stackoverflow.com/a/26908339/2218697), hy vọng sẽ giúp ai đó. – stom