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