2010-05-25 3 views
3

В приложении C# ASP.NET MVC я использую ссылку для SQL для предоставления данных для своего приложения. Я получил простую схему базы данных, как это: My database http://www.freeimagehosting.net/uploads/756d306565.jpgВызов SubmitChanges в DataContext не обновляет базу данных

В моем классе контроллера я ссылаться на этот контекст данных, который называется Model (как вы можете увидеть на правой стороне изображения в свойствах), как это:

private Model model = new Model(); 

У меня есть таблица (Список) серии, представленная на моей странице. Это делает правильно, и я был в состоянии добавить функцию удаления для удаления серии, как это:

public ActionResult Delete(int id) { 
    model.Series.DeleteOnSubmit(model.Series.SingleOrDefault(s => s.ID == id)); 
    model.SubmitChanges(); 
    return RedirectToAction("Index"); 
} 

В случае необходимости ссылка действий выглядит следующим образом:

<%: Html.ActionLink("Delete", "Delete", new { id=item.ID })%> 

Кроме того, создание (реализовано аналогичным образом) работает отлично. Однако редактирование не работает. Мои изменения выглядят так:

public ActionResult Edit(int id) { 
    return View(model.Series.SingleOrDefault(s => s.ID == id)); 
} 

[HttpPost] 
public ActionResult Edit(Series series) { 

    if (ModelState.IsValid) { 
     UpdateModel(series); 

     series.Title = series.Title + " some string to ensure title has changed"; 
     model.SubmitChanges(); 

     return RedirectToAction("Index"); 
    } 
    return View(series); 
} 

Я контролировал, что в моей базе данных установлен первичный ключ правильно. Я отлаживал свое приложение и выяснял, что все работает так, как ожидалось, до линии с model.SubmitChanges();. Эта команда не применяет изменения свойства Title (или любого другого) к базе данных.

Пожалуйста, помогите.

EDIT: Если добавить эту строку: model.Series.Attach(series); как раз перед model.SubmitChanges(); нет никаких изменений - редактирует все еще не отражает в базу данных. Экземпляр передан методу Edit, поскольку параметр уже привязан к контексту данных model.

EDIT: код зрения, что принадлежит метод Edit:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<TVSeriesInfoApp.Models.Series>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
Edit 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

<h2>Edit</h2> 

<% using (Html.BeginForm()) {%> 
    <%: Html.ValidationSummary(true) %> 

    <fieldset> 
     <legend>Fields</legend> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.Title) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.Title) %> 
      <%: Html.ValidationMessageFor(model => model.Title) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.Seasons) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.Seasons) %> 
      <%: Html.ValidationMessageFor(model => model.Seasons) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.Stars) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.Stars) %> 
      <%: Html.ValidationMessageFor(model => model.Stars) %> 
     </div> 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 

<% } %> 

<div> 
    <%: Html.ActionLink("Back to List", "Index") %> 
</div> 

</asp:Content> 

ответ

4

Это будет выглядеть наше действие Edit (Скорректировано для вашего режима л):

[HttpPost] 
public ActionResult Edit(int id, Series series) 
{ 
    Series updatingSeries = model.Series.Single(s => s.ID == id); 

    try 
    { 
     TryUpdateModel(updatingSeries); 
     model.SubmitChanges(); 

     return RedirectToAction("Details", new { id = updatingSeries.ID }); 
    } 
    catch 
    { 
     return View(updatingSeries); 
    } 
} 

Это может произойти из-за того, что ModelState может быть недействительным в некоторых случаях. Вы что-то сделали для представления? Можете ли вы также опубликовать свой код вида здесь?

+0

Вид отлично работает, я думаю, потому что я контролировал содержимое параметра серии, возвращаемого методу Edit (используя точку останова). Все свойства установлены так, как ожидается, так что представление работает нормально. Кроме того, я еще не тестировал его с недопустимыми значениями, поэтому ModelState.isValid() всегда верен внутри метода редактирования. Также не нарушены правила ведения бизнеса. В любом случае, добавьте код просмотра. – drasto

+0

Код вида есть - см. Последнее редактирование. – drasto

+0

Когда я заменяю свой код на ваш, он работает. – drasto

1

Во-первых, никогда никогда не "удалить" с HTTP GET (это именно то, что вы делаете с Html.ActionLink("Delete", "Delete", new { id=item.ID })

.

Что касается изменений, вы должны сначала указать Attach свой экземпляр на DataContext.

+0

Экземпляр уже привязан к моему контексту данных. См. Править. – drasto

+0

Что касается «delete», то код 'Html.ActionLink (« Удалить »,« Удалить », новый {id = item.ID})' был сгенерирован VS ... – drasto

+0

@Anton: Почему бы и нет? Он может отправить запрос другому Вид, а затем подтвердить его с помощью HTTP POST. –

Смежные вопросы