编辑方法没有像流行书中所解释的那样起作用

时间:2011-10-09 11:25:32

标签: asp.net-mvc

我买了一本关于MVC 3的书。在本书中,有一个实现编辑方法的例子。以下是代码:

[HttpPost]
public ActionResult Edit(Product product) {
    if (ModelState.IsValid) {
        TryUpdateModel(product); 
        repository.SaveProduct(product);
        return RedirectToAction("Index");
    } else {
        // there is something wrong with the data values
        return View(product);
    }
}

此代码非常适合创建新产品,但不适用于现有产品的版本。

我更新了成功编辑产品的代码(请参阅下面的代码):

[HttpPost]
public ActionResult Edit(Product prod)
{
    if (ModelState.IsValid)
    {
        Product product = repository.Products.FirstOrDefault(p => p.ProductID == prod.ProductID);
        TryUpdateModel(product);
        repository.SaveProduct(product);
        return RedirectToAction("Index");
    }
    else
    {
        // there is something wrong with the data values
        return View(prod);
    }
}

修改

以下是Saveproduct方法:

public void SaveProduct(Product product)
{
    if (product.ProductID == 0)
    {
        context.Products.Add(product);
    }         
    context.SaveChanges();
}

正如您所看到的,我在代码中所做的修改是基于他的ID检索产品,然后保存产品。

我的问题:为什么第二种方法有效而不是第一种?在第二种方法中,为什么我们必须从存储库中检索产品?

感谢。

3 个答案:

答案 0 :(得分:1)

您不需要额外的TryUpdateModel方法调用,因为当您将模型作为Edit方法中的参数接收时,MVC已经更新了模型。

[HttpPost]
public ActionResult Edit(Product product) {
    if (ModelState.IsValid) {
        repository.SaveProduct(product);
        return RedirectToAction("Index");
    } else {
        // there is something wrong with the data values
        return View(product);
    }
}

您的SaveProduct方法无法正确处理分离实体的编辑。

public void SaveProduct(Product product)
{
    if (product.ProductID == 0)
    {
        context.Products.Add(product);
    }
    else
    {
       var entry = context.Entry(product);
       entry.State = EntityState.Modified;
    }         
    context.SaveChanges();
}

答案 1 :(得分:1)

Creating an EF Data Model解释了所有这些

答案 2 :(得分:0)

区别在于上下文知道内存中的实体与磁盘上的数据之间的连接。

当你将一个实体放入你的一个方法时,上下文对它一无所知。所以它无法保存它。如果从数据库中提取行并更新它,则上下文知道它已更新并可以保存它。

您可以做的另一件事是将传入的实体附加到上下文。