2010-05-25 52 views
3

在C#ASP.NET MVC应用程序中,我使用链接到SQL为我的应用程序提供数据。我有简单的数据库模式是这样的: My database http://www.freeimagehosting.net/uploads/756d306565.jpg在DataContext上调用SubmitChanges不会更新数据库

在我的控制器类我引用这样叫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属性(或任何其他)的更改。

请帮忙。

编辑: 如果我加入这一行:model.Series.Attach(series);只是model.SubmitChanges();之前没有任何变化 - 编辑仍然没有反映到数据库。作为参数传递给Edit方法的实例已经附加到数据上下文model

编辑: 的视图代码属于方法编辑:

<%@ 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

这是我们的编辑动作将是什么样子(调整后为您模式l):

[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()在Edit方法中始终为true。没有业务规则被破坏。不管怎样,我会添加视图代码。 – drasto 2010-05-25 12:07:23

+0

视图代码存在 - 请参阅上次编辑。 – drasto 2010-05-25 12:17:56

+0

当我用你的代码替换我的代码时,它可以工作。 – drasto 2010-05-25 12:50:06

1

首先,从来没有 “删除” 使用HTTP GET(这是你与Html.ActionLink("Delete", "Delete", new { id=item.ID })做什么

至于编辑,你首先要Attach您的实例的DataContext

+0

该实例已连接到我的数据上下文。请参阅编辑。 – drasto 2010-05-25 11:43:01

+0

至于“删除”,代码'Html.ActionLink(“删除”,“删除”,新{id = item.ID})'由VS生成... – drasto 2010-05-25 11:48:26

+0

@Anton:为什么不呢?他可能会将请求发送到另一个View,然后必须通过HTTP POST进行确认。 – 2010-05-25 11:50:43

相关问题