ViewModels和创建/编辑操作出错

时间:2010-10-07 18:44:35

标签: c# asp.net-mvc viewmodel

我正在尝试使用NerdDinner教程之后的Northwind数据库创建ASP.NET MVC 2 webapp,但现在我在尝试编辑产品时遇到以下错误:

  

“供应商”类型对象的成员“SupplierID”的值已更改。   无法更改定义对象标识的成员。   考虑添加具有新标识的新对象并删除现有标识。

仅当我更改类别和/或供应商(两者都是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>

当然,这些代码只是每个Controller和Views的摘录。 ProductViewModel是完整的代码。我省略了ProductRepository类。

1 个答案:

答案 0 :(得分:1)

在ur controller action方法中放置一个断点并读取modelstate对象。检查每个键以检查是否有错误。错误的描述会有所帮助。在那之前尝试

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

这是我在L2S中通过列表框编辑外键值时所做的。不确定你是否使用EF。