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