2012-04-09 57 views
-1

我已經從ASP.NET MVC的Telerik擴展(Telerik Sample)中的編輯批處理示例實現了一個MVC3/Razor網格控件,我認爲它的大部分工作,但我注意到,雖然更新似乎在客戶端上工作,但基礎數據庫表不會更新。MVC3 Telerik批量編輯更新更新客戶端,但不是數據庫表

我以爲我可能在執行此操作時錯過了一些步驟,但是在我使用Northwind數據庫下載的Telerik示例中的Product Name的批處理編輯示例中進行了更新之後,底層數據表也沒有改變。

VIEW:

@model IEnumerable<MarketingWebsiteTools.Models.EditableCallout> 

@using MarketingWebsiteTools.Extensions; 
@using MarketingWebsiteTools.Models; 

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Marketing Messages</h2> 


@(Html.Telerik().Grid<MarketingWebsiteTools.Models.EditableCallout>() 
    .Name("Grid") 
      .DataKeys(keys => 
      { 
       keys.Add(p => p.id); 
      }) 
     .ToolBar(commands => 
     { 
      commands.Insert(); 
      commands.SubmitChanges(); 
     }) 
    .Columns(columns => 
    { 

     columns.Bound(o => o.ProductIdentifier).Width(125); 
     columns.Bound(o => o.DateStart).Width(75); 
     columns.Bound(o => o.DateEnd).Width(75); 
     columns.Bound(o => o.Value).Width(75); 
     columns.Bound(o => o.IsActive).Width(75); 
     columns.Command(commands => commands.Delete()).Width(125).Title("Delete"); 
    }) 
       .ClientEvents(events => events.OnDataBinding("Grid_onDataBinding").OnError("Grid_onError")) 
       .Editable(editing => editing.Mode(GridEditMode.InCell).DefaultDataItem(new EditableCallout 
       { 
        DateStart = DateTime.Today 

       })) 
      .DataBinding(dataBinding => dataBinding.Ajax() 
      .Select("_Index", "Callouts") 
      .Update("_SaveBatchEditing", "Callouts") 
      ) 

      .Pageable() 
      .Scrollable() 
      .Sortable() 
      .Groupable() 
      .Filterable() 
) 

<script type="text/javascript"> 
    function Grid_onError(args) { 
     if (args.textStatus == "modelstateerror" && args.modelState) { 
      var message = "Errors:\n"; 
      $.each(args.modelState, function (key, value) { 
       if ('errors' in value) { 
        $.each(value.errors, function() { 
         message += this + "\n"; 
        }); 
       } 
      }); 
      args.preventDefault(); 
      alert(message); 
     } 
    } 
    function Grid_onDataBinding(e) { 
     var grid = $(this).data('tGrid'); 
     if (grid.hasChanges()) { 
      if (!confirm('You are going to lose any unsaved changes. Are you sure?')) { 
       e.preventDefault(); 
      } 
     } 
    } 
</script> 


@section HeadContent { 
<style type="text/css"> 
    .field-validation-error 
    { 
     position: absolute; 
     display: block; 
    } 

    * html .field-validation-error { position: relative; } 
    *+html .field-validation-error { position: relative; } 

    .field-validation-error span 
    { 
     position: absolute; 
     white-space: nowrap; 
     color: red; 
     padding: 17px 5px 3px; 
     background: transparent url('@Url.Content("~/Content/Common/validation-error-message.png") ') no-repeat 0 0; 
    } 

    /* in-form editing */ 
    .t-edit-form-container 
    { 
     width: 350px; 
     margin: 1em; 
    } 

    .t-edit-form-container .editor-label, 
    .t-edit-form-container .editor-field 
    { 
     padding-bottom: 1em; 
     float: left; 
    } 

    .t-edit-form-container .editor-label 
    { 
     width: 30%; 
     text-align: right; 
     padding-right: 3%; 
     clear: left; 
    } 

    .t-edit-form-container .editor-field 
    { 
     width: 60%; 
    } 
</style> 
} 

控制器:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using PagedList; 
using Telerik.Web.Mvc; 
using MarketingWebsiteTools.Models; 
using MarketingWebsiteTools.ViewModels; 
//using MarketingWebsiteTools.Services; 
using MarketingWebsiteTools.Filters; 

namespace MarketingWebsiteTools.Controllers 
{ 
    public partial class CalloutsController : Controller 
    { 
     [SourceCodeFile("EditableCallout", "~/Models/EditableCallout.cs", Order=1)] 
     [SourceCodeFile("SessionCalloutRepository", "~/Models/SessionCalloutRepository.cs", Order = 2)] 
     [SourceCodeFile("SessionCalloutRepository", "~/Models/SessionCalloutRepository.cs", Order = 3)] 

     public ActionResult Index() 
     { 
      return View(); 
     } 

     [GridAction] 
     public ActionResult _Index() 
     { 
      return View(new GridModel(SessionCalloutRepository.All())); 
     } 

     [AcceptVerbs(HttpVerbs.Post)] 
     [CultureAwareAction] 
     [GridAction] 
     public ActionResult _SaveBatchEditing([Bind(Prefix = 
      "inserted")]IEnumerable<EditableCallout> insertedCallouts, 
      [Bind(Prefix = "updated")]IEnumerable<EditableCallout> updatedCallouts, 
      [Bind(Prefix = "deleted")]IEnumerable<EditableCallout> deletedCallouts) 
     { 
      if (insertedCallouts != null) 
      { 
       foreach (var callouts in insertedCallouts) 
       { 
        SessionCalloutRepository.Insert(callouts); 
       } 
      } 
      if (updatedCallouts != null) 
      { 
       foreach (var callouts in updatedCallouts) 
       { 

        var target = SessionCalloutRepository.One(p => p.id == callouts.id); 
        if (target != null) 
        { 
         target.DateStart = callouts.DateStart; 
         target.DateEnd = callouts.DateEnd; 
         target.Value = callouts.Value; 
         target.IsActive = callouts.IsActive; 
         SessionCalloutRepository.Update(target); 
        } 
       } 
      } 
      if (deletedCallouts != null) 
      { 
       foreach (var product in deletedCallouts) 
       { 
        SessionCalloutRepository.Delete(product); 
       } 
      } 
      return View(new GridModel(SessionCalloutRepository.All())); 
     } 
    } 
} 

MODEL:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Runtime.Serialization; 

namespace MarketingWebsiteTools.Models 
{ 
    //[KnownType(typeof(EditableCallout))] 
    public class EditableCallout 
    { 
     //[ScaffoldColumn(false)] 
     [DisplayName("id")] 
     public int id { get; set; } 
     [Required] 
     [DisplayName("ProductIdentifier")] 
     public string ProductIdentifier { get; set; } 

     [DisplayName("DateStart")] 
     public DateTime? DateStart { get; set; } 

     [DisplayName("DateEnd")] 
     public DateTime? DateEnd { get; set; } 

     [DisplayName("IsActive")] 
     public int? IsActive { get; set; } 

     [DisplayName("Value")] 
     public string Value { get; set; } 
    } 
} 

倉庫:

namespace MarketingWebsiteTools.Models 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using MarketingWebsiteTools.ViewModels; 
    using MarketingWebsiteTools.Models; 

    public static class SessionCalloutRepository 
    { 
     public static IList<EditableCallout> All() 
     { 
      WebsiteDataContext wdc = new WebsiteDataContext(); 
      //CalloutContext db = new CalloutContext(); 
      IList<EditableCallout> result = (IList<EditableCallout>)HttpContext.Current.Session["Callouts"]; 

      if (result == null) 
      { 
       HttpContext.Current.Session["Callouts"] = result = 
        (from c in wdc.CalloutToProducts 
        join cv in wdc.CalloutValues on c.CalloutID equals cv.CalloutID 
        select new EditableCallout 
        { 
         id = c.id, 
         ProductIdentifier = c.ProductIdentifier, 
         DateStart = c.DateStart, 
         DateEnd = c.DateEnd, 
         Value = cv.Value, 
         IsActive = c.IsActive 
        }).ToList(); 
      } 

      return result; 
     } 


     public static EditableCallout One(Func<EditableCallout, bool> predicate) 
     { 
      return All().Where(predicate).FirstOrDefault(); 
     } 
     public static void Insert(EditableCallout callout) 
     { 
      callout.id = All().OrderByDescending(c => c.id).First().id+ 1; 
      All().Insert(0, callout); 
     } 

     public static void Update(EditableCallout callout) 
     { 
      EditableCallout target = One(c => c.id == callout.id); 
      if (target != null) 
      { 
       target.ProductIdentifier = callout.ProductIdentifier; 
       target.DateEnd = callout.DateEnd; 
       target.DateStart = callout.DateStart; 
       target.Value = callout.Value; 
       target.IsActive = callout.IsActive; 

      } 
     } 
     public static void Delete(EditableCallout callout) 
     { 
      EditableCallout target = One(c => c.id== callout.id); 
      if (target != null) 
      { 
       All().Remove(target); 
      } 
     } 
    } 
} 

由於

道格

回答

2

的Telerik的演示有意不更新基礎數據基礎。所有更改都保存在內存中(在Session中)。您需要添加將更新數據庫的必需代碼。