Я пытаюсь создать веб-приложение ASP.NET MVC 2, используя базу данных Northwind, следуя инструкции NerdDinner, но теперь я продолжаю получать следующую ошибку при попытке РЕДАКТИРОВАТЬ продукт:
Изменено значение элемента 'SupplierID' объекта типа 'Supplier'.
Член, определяющий идентичность объекта, не может быть изменен.
Попробуйте добавить новый объект с новым идентификатором и удалить вместо него существующий.
Это происходит только тогда, когда я изменяю категорию и / или поставщиков (оба являются DropDownLists), остальные поля (флажок и текстовое поле) в порядке.
Я также не могу СОЗДАТЬ новый продукт, так как Model.IsValid
всегда возвращает false по какой-то причине (без исключений).
Что я делаю не так?
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
класс.