2010-10-07 2 views
1

Я пытаюсь создать веб-приложение ASP.NET MVC 2, используя базу данных Northwind, следуя руководству NerdDinner, но теперь я продолжаю получать следующую ошибку при попытке ИЗМЕНИТЬ ПРОДУКТ:Ошибка с ViewModels и создание/редактирование действий

Значение участника 'SupplierID' объекта типа 'Поставщик' изменено. Элемент, определяющий идентичность объекта, не может быть изменен. Рассмотрите возможность добавления нового объекта с новым идентификатором и удаления существующего.

Это происходит только при изменении категории и/или поставщиков (оба являются списками DropDownLists), другие поля (флажок и текстовое поле) в порядке.

Я также не могу СОЗДАТЬ новый продукт, так как Model.IsValid всегда возвращает ложь по какой-либо причине (без исключений).

Что я делаю неправильно?

ProductController.cs
public ActionResult Edit(int id) { 
     Product productToEdit = productsRepository.Get(id); 

     return View(new ProductViewModel(productToEdit)); 
    } 

    [HttpPost] 
    public ActionResult Edit(int id, FormCollection formValues) { 
     Product productToEdit = productsRepository.Get(id); 

     if (TryUpdateModel(productToEdit, "Product")) { 
      productsRepository.Save(); 
      return RedirectToAction("Details", new { id = productToEdit.ProductID }); 
     } 

     return View(productToEdit); 
    } 

ProductViewModel.cs
public class ProductViewModel { 

    public Product Product { get; private set; } 
    public SelectList Suppliers { get; private set; } 
    public SelectList Categories { get; private set; } 

    public ProductViewModel(Product product) { 
     this.Product = product; 

     this.Suppliers = new SelectList(new SuppliersRepository() 
      .GetAllSuppliers() 
      .Select(s => new SelectListItem { 
       Text = s.CompanyName, 
       Value = s.SupplierID.ToString() 
      }), "Value", "Text"); 

     this.Categories = new SelectList(new CategoriesRepository() 
      .GetAllCategories() 
      .Select(c => new SelectListItem { 
       Text = c.CategoryName, 
       Value = c.CategoryID.ToString() 
      }), "Value", "Text"); 
    } 
} 

ProductForm.ascx

 <div class="editor-label"> 
      <%= Html.LabelFor(model => model.Product.SupplierID) %> 
     </div> 

     <div class="editor-field"> 
      <%= Html.DropDownListFor(model => model.Product.Supplier.SupplierID, Model.Suppliers) %> 
     </div> 

Конечно, эти коды только выдержки из каждого контроллера и представлений. Код ProductViewModel - это полный код. Я пропустил класс ProductRepository.

+0

Вместо Nerddinner прочитайте книгу Стива Сандерсона о MVC. У него есть что сказать о образцах, которые написаны для презентаций, в отличие от рабочих примеров. – awrigley

+0

@awrigley, NerdDinner - рабочий пример: http://www.nerddinner.com/ –

+0

Я знаю. Я видел видео. Я читал книгу. Я также читал книгу Стива Сандерсона. Вы получаете гораздо лучшую «рабочую» идею MVC от более поздней. Даже если это работает, Nerddinner все еще был создан как презентация, а не как решение рабочей лошади для общих проблем программирования. – awrigley

ответ

1

положил точку прерывания в метод действия контроллера Ур и прочитал объект modelstate. проверьте каждую клавишу, чтобы проверить, есть ли ошибка. описание ошибки поможет. до этого попробуйте

<div class="editor-field"> 
      <%= Html.DropDownListFor(model => model.SupplierID, Model.Suppliers) %> 
     </div> 

Это то, что я делаю при редактировании значения внешнего ключа через список в L2S. не уверен, что с помощью EF.

+0

О! Это было почти так! Вместо того, чтобы использовать модель. Product.Supplier.SupplierID' в выпадающем списке, я сделал amodel.Product.SupplierID'! Большое спасибо!! – BrunoSalvino

+0

u r приветствуется :) –

Смежные вопросы