ASP.NET MVC3 редактировать действие не обновляет записи в базе данных - PullRequest
0 голосов
/ 07 июля 2011

У меня настроено действие редактирования, которое не обновляет записи, но не выдает никаких исключений.Обновление работает, но изменения не отражены в базе данных.

Я использую 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();
    }

Затем в контроллере можно получитьи отправлять действия

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>
}

У меня также есть метод create, связанный с тем же действием редактирования и представлением, который работает нормально.Не знаете, где я ошибаюсь, я новичок в MVC3 и не уверен, что моя правка редактирования верна?

1 Ответ

2 голосов
/ 07 июля 2011

Простой ответ заключается в том, что вы работаете в среде без состояния , если только вы не используете самоконтроль сущностей, вам необходимо Attach объект для графика EF.

Хотя в прошлом у меня были проблемы с редактированием. В итоге я пошел в БД, чтобы сначала получить объект, затем слить необходимые мне изменения и затем сохранить.

Вы должны отделить ваши действия по созданию / редактированию. Недостаточно просто проверить, что ID> 0 для редактирования не достаточно,

Итак, подведем итог:

  1. Есть один метод действия для новых объектов. Используйте context.AddObject в этом сценарии.
  2. Есть еще один метод действия для изменения объектов. Получите объект из репозитория, объедините ваши изменения (слева направо, или с автоматическим сопоставлением, или с TryUpdateModel) и выполните context.SaveChanges.

В целом, это боль. Многие разработчики (включая меня) прошли через то, что у вас есть.

...