MVC3 Telerik批量编辑更新更新客户端但不更新数据库表

时间:2021-01-14 00:03:05

I've implemented an MVC3/Razor Grid Control from the Editing Batch example in the Telerik Extensions for ASP.NET MVC (Telerik Sample) and for the most part, I think it's working, however I have noticed that while the updates appear to be working on the client, the underlying database tables are not updated.

我已经在Telerik Extensions for ASP.NET MVC(Telerik Sample)的编辑批处理示例中实现了一个MVC3 / Razor网格控件,但我认为它正在工作,但我注意到虽然更新似乎是在客户端上工作,底层数据库表不会更新。

I thought that I may have missed some step in my implementation of this, however after doing an update in the Batch Editing example for a Product Name in the Telerik Example that I downloaded using the Northwind database, the underlying data tables also is not changed.

我认为我可能错过了执行此操作的一些步骤,但是在使用Northwind数据库下载的Telerik示例中的产品名称的批处理编辑示例中进行更新后,基础数据表也未更改。

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

CONTROLLER:

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

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

Thanks

Doug

1 个解决方案

#1


2  

The Telerik demos are intentionally not updating the underlying data base. All changes are kept in-memory (in Session). You need to add the required code which will update the data base.

Telerik演示故意不更新基础数据库。所有更改都保留在内存中(在会话中)。您需要添加将更新数据库的所需代码。

#1


2  

The Telerik demos are intentionally not updating the underlying data base. All changes are kept in-memory (in Session). You need to add the required code which will update the data base.

Telerik演示故意不更新基础数据库。所有更改都保留在内存中(在会话中)。您需要添加将更新数据库的所需代码。