2012-04-09 6 views
-1

Ich habe eine MVC3/Razor Grid Control aus dem Bearbeitungs Batch-Beispiel in den Telerik Extensions für ASP.NET MVC (Telerik Sample) implementiert und zum größten Teil glaube ich es ist funktioniert, aber ich habe festgestellt, dass die zugrunde liegenden Datenbanktabellen nicht aktualisiert werden, während die Updates auf dem Client zu funktionieren scheinen.MVC3 Telerik Stapelbearbeitung Update Updates Client aber nicht DB-Tabellen

Ich dachte, dass ich einen Schritt in meiner Implementierung verpasst haben könnte, jedoch nach einer Aktualisierung im Batch Editing-Beispiel für einen Produktnamen im Telerik-Beispiel, das ich mit der Northwind-Datenbank heruntergeladen habe, auch die zugrunde liegenden Datentabellen wird nicht geändert.

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

REGLER:

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())); 
     } 
    } 
} 

MODELL:

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

REPOSITORY:

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

Dank

Doug

Antwort

2

Die Telerik Demos sind absichtlich nicht die zugrunde liegende Datenbank zu aktualisieren. Alle Änderungen werden im Speicher (in Sitzung) gespeichert. Sie müssen den erforderlichen Code hinzufügen, der die Datenbank aktualisiert.

Verwandte Themen