我正在尝试使用NerdDinner教程之后的Northwind数据库创建ASP.NET MVC 2 webapp,但现在我在尝试编辑产品时遇到以下错误:
“供应商”类型对象的成员“SupplierID”的值已更改。 无法更改定义对象标识的成员。 考虑添加具有新标识的新对象并删除现有标识。
仅当我更改类别和/或供应商(两者都是DropDownLists),其他字段(复选框和文本框)都可以时,才会发生这种情况。
我也无法创建新产品,因为Model.IsValid
因某种原因(无例外)总是返回false。
我做错了什么?
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);
}
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");
}
}
<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>
当然,这些代码只是每个Controller和Views的摘录。 ProductViewModel
是完整的代码。我省略了ProductRepository
类。
答案 0 :(得分:1)
在ur controller action方法中放置一个断点并读取modelstate对象。检查每个键以检查是否有错误。错误的描述会有所帮助。在那之前尝试
<div class="editor-field">
<%= Html.DropDownListFor(model => model.SupplierID, Model.Suppliers) %>
</div>
这是我在L2S中通过列表框编辑外键值时所做的。不确定你是否使用EF。