ASP.NET MVC3编辑操作不更新数据库中的记录

时间:2011-07-07 08:52:01

标签: asp.net-mvc-3 repository edit

我配置了一个编辑操作,它不会更新记录但不会抛出任何异常。更新似乎有效,但更改未反映在数据库中。

我正在使用EF和MVC3,我有一个定义保存客户的界面

 public interface ICustomerRepository
 {
    //allows a sequence of customers to be displayed
    IQueryable<Customer> Customers { get; }
    //saves edits to customer records
    void SaveCustomer(Customer customer);
 }

然后我实现了这个

public void SaveCustomer(Customer customer) 
    {
        if (customer.CustomerId == 0)
        {
            context.Customers.Add(customer);
        }
        context.SaveChanges();
    }

然后在控制器中我的get和post动作

public ViewResult Edit(int customerId)
    {
        Customer customer = repository.Customers.FirstOrDefault(c => c.CustomerId ==   customerId);
        return View(customer);
    }

 [HttpPost]
    public ActionResult Edit(Customer customer)
    {
        if (ModelState.IsValid)
        {
            repository.SaveCustomer(customer);
            TempData["message"] = string.Format("{0} has been saved",    customer.CustomerName);
            return RedirectToAction("Index");
        }
        else
        {
            //there is something wrong with the data values
            return View(customer);
        }
    }

然后在我看来我有

 @model CustomerOrders.Domain.Entities.Customer

@{
ViewBag.Title = "Admin: Edit" + @Model.CustomerName;
Layout = "~/Views/Shared/_AdminLayout.cshtml";
 }

 <h1>Edit @Model.CustomerName</h1>

using (Html.BeginForm("Edit", "Admin"))
{
<div class="left-column">
<div class="editor">@Html.EditorFor(model => model.CustomerId)</div>
<div class="label-for">@Html.LabelFor(model => model.CustomerName)</div>
<div class="editor">@Html.EditorFor(model => model.CustomerName)</div>
@Html.ValidationMessageFor(model => model.CustomerName)
</div>
<div class="middle-column">
<div class="label-for">@Html.LabelFor(model => model.PrimaryContactName)</div>
<div class="editor">@Html.EditorFor(model => model.PrimaryContactName)</div>
<div class="label-for">@Html.LabelFor(model => model.PrimaryContactNo)</div>
<div class="editor">@Html.EditorFor(model => model.PrimaryContactNo)</div>
</div>
<div class="right-column">
<input type="submit" value="Save" />
@Html.ActionLink("Cancel and return to list", "Index")
</div>
}

我还有一个连接到相同编辑操作和视图的创建方法,它可以正常工作。不确定我哪里出错了,我对MVC3不熟悉并且不确定我的编辑实现是否正确?

1 个答案:

答案 0 :(得分:2)

简单的答案是因为您在无状态环境中工作,除非您使用自我跟踪实体,否则您需要Attach对象到EF的图形。

我过去曾遇到编辑问题。所以我最后去DB拿取对象,然后合并我需要的更改,然后做Save。

您需要将创建/编辑操作分开。只需检查ID&gt; 0认为编辑是不够的,更明确。

总结一下:

  1. 为新对象设置一个操作方法。在此方案中使用context.AddObject。
  2. 有另一种修改对象的操作方法。从存储库中获取对象,合并您的更改(从左到右,或自动映射器或TryUpdateModel),并执行context.SaveChanges。
  3. 总的来说,这是一种痛苦。许多开发人员(包括我自己)已经完成了你的工作。