我已经从 ASP.NET MVC 的 Telerik Extensions ( Telerik Sample ) 中的编辑批处理示例中实现了 MVC3/Razor 网格控件,并且在大多数情况下,我认为它正在工作,但是我注意到虽然更新似乎是在客户端上工作,基础数据库表不会更新。
我认为我可能错过了执行此操作的某些步骤,但是在我使用 Northwind 数据库下载的 Telerik 示例中的产品名称的批量编辑示例中进行更新后,基础数据表也没有更改。
看法:
@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()));
}
}
}
模型:
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);
}
}
}
}
谢谢
道格