2015-05-15 3 views
0

Во время редактирования сетки мне нужно проверить ввод данных, и если он не прошел проверку, мне нужно вернуть плохие данные обратно в неизмененное состояние, чтобы оно не сохранялось (аналогично использованию кнопки Reset, но только для редактирования текущей строки ... это сетка редактирования партии).Telerik Kendo UI Grid MVC - Programmatically Cancel Edits

Используя код javascript ниже, я могу идентифицировать проблему, вызывать предупреждение, но после того, как пользователь примет предупреждение, они все равно могут просто нажать кнопку «Сохранить», и это сохранит этот путь с неправильными данными.

Для борьбы с этим вы увидите, что я пытаюсь установить e.values ​​и e.model в 0, но он не работает (ошибка не возникает, она просто не меняет значения в сетке) ,

Возможно, мне нужно идентифицировать элемент DOM и изменить его значение напрямую, но я не смог найти способ извлечь элемент DOM из объекта e.

function beforeCartonPackUpdates(e) { 
    if (e.values.QtyToPack > e.model.OrderedQty) { 
     alert("ERROR! You cannot pack more than was ordered."); 
     e.model.set("QtyToPack", 0); 
     e.values.QtyToPack = 0; 
     return false; 
    } 

    if (e.values.QtyToPack > e.model.RemainingToPack) { 
     alert("Warning! You are packing more than is available."); 
     return true; 
    } 
} 

@(Html.Kendo().Grid<OTIS.AppServ.OrderMgmt.ViewModels.ShipOrderDetailViewModel>() 
    .Name("ShipOrderDtlsGrid") 
    .HtmlAttributes(new { style = "width:100%;" }) 
    .Resizable(resize => resize.Columns(true)) 
    .Columns(columns => 
    { 
     columns.Bound(l => l.Id).Hidden(); 
     columns.Bound(l => l.OrderHeaderId).Hidden(); 
     columns.Bound(l => l.StatusId).Hidden(); 
     columns.Bound(l => l.ItemId) 
      .ClientTemplate("<a href='" + 
            Url.Action("Edit", "ManageItems", new { area = "InventoryMgmt" }) + 
            "/#= ItemId #'" + 
           " target='_blank'>#= ItemDescription #</a>" 
          ) 
      .ClientFooterTemplate("#=kendo.format('Line Count: {0:n0}', count)#"); 
     columns.Bound(l => l.OrderedQty) 
      .Title("Ord") 
      .HeaderHtmlAttributes(new { style = "text-align:right;" }) 
      .HtmlAttributes(new { style = "text-align:right;" }) 
      .FooterHtmlAttributes(new { style = "text-align:right;" }) 
      .ClientFooterTemplate("#=kendo.format('{0:n2}', sum)#"); 
     columns.Bound(l => l.BackorderedQty) 
      .Title("B/O") 
      .HeaderHtmlAttributes(new { style = "text-align:right;" }) 
      .HtmlAttributes(new { style = "text-align:right;" }) 
      .FooterHtmlAttributes(new { style = "text-align:right;" }) 
      .ClientFooterTemplate("#=kendo.format('{0:n2}', sum)#"); 
     columns.Bound(l => l.PickedQty) 
      .Title("Pick") 
      .HeaderHtmlAttributes(new { style = "text-align:right;" }) 
      .HtmlAttributes(new { style = "text-align:right;" }) 
      .FooterHtmlAttributes(new { style = "text-align:right;" }) 
      .ClientFooterTemplate("#=kendo.format('{0:n2}', sum)#"); 
     columns.Bound(l => l.PackedQty) 
      .Title("Pack") 
      .HeaderHtmlAttributes(new { style = "text-align:right;" }) 
      .HtmlAttributes(new { style = "text-align:right;" }) 
      .FooterHtmlAttributes(new { style = "text-align:right;" }) 
      .ClientFooterTemplate("#=kendo.format('{0:n2}', sum)#"); 
     columns.Bound(l => l.RemainingToPack) 
      .Title("Remain") 
      .HeaderHtmlAttributes(new { style = "text-align:right;" }) 
      .HtmlAttributes(new { style = "text-align:right;" }) 
      .FooterHtmlAttributes(new { style = "text-align:right;" }) 
      .ClientFooterTemplate("#=kendo.format('{0:n2}', sum)#"); 
     columns.Bound(l => l.QtyToPack) 
      .HeaderHtmlAttributes(new { style = "text-align:right;" }) 
      .HtmlAttributes(new { @class = "editable", style = "text-align:right;" }) 
      .FooterHtmlAttributes(new { style = "text-align:right;" }) 
      .ClientFooterTemplate("#=kendo.format('{0:n2}', sum)#"); 
     //columns.Command(command => 
     // { 
     //  command.Edit(); 
     //  command.Destroy(); 
     // }).Width(180); 
    }) 
    .Editable(editing => editing.Mode(GridEditMode.InCell)) 
    .Events(events => 
    { 
     //events.SaveChanges("afterCartonPackUpdates"); //fires BEFORE saving - good place to do validation 
     events.Save("beforeCartonPackUpdates"); //fires Before saving, but as soon as cell value changes, better place to do validation 
     events.SaveChanges("preCartonPackUpdates");//fires AFTER .Save but before calling destroy method 
    } 
    ) 
     // Add "Create" command 
    .ToolBar(toolbar => 
    { 
     //toolbar.Create().Text("Add Work Order Detail"); 
     toolbar.Template(@<text>@RenderOrderDetailsToolBar()</text>); 
     //toolbar.Custom().Text("<span class='k-icon k-cancel'></span>Cancel</text>").Url("##_").HtmlAttributes(new { @class = "k-grid-cancel-changes" }); 
     //toolbar.Custom().Text("<span class='k-icon k-update'></span>Pack</text>").Url("##_").HtmlAttributes(new { @class = "k-grid-save-changes" }); 
     //toolbar.Save(); 
    }) 

    .DataSource(dataSource => dataSource 
     .Ajax() // Specify that the data source is of ajax type 
     .Aggregates(aggregates => 
     { 
      aggregates.Add(x => x.ItemId).Count(); 
      aggregates.Add(x => x.OrderedQty).Sum(); 
      aggregates.Add(x => x.PickedQty).Sum(); 
      aggregates.Add(x => x.RemainingToPack).Sum(); 
      aggregates.Add(x => x.QtyToPack).Sum(); 
      aggregates.Add(x => x.PackedQty).Sum(); 
      aggregates.Add(x => x.BackorderedQty).Sum(); 
     }) 
     .Batch(true) 
     .Model(model => 
     { 
      model.Id(c => c.Id); 
      model.Field(c => c.OrderHeaderId).DefaultValue(Model.Id); 
      model.Field(c => c.UnitCost).Editable(false); 
      model.Field(c => c.ItemDescription).Editable(false); 
      model.Field(c => c.OrderedQty).Editable(false); 
      model.Field(c => c.PickedQty).Editable(false); 
      model.Field(c => c.PackedQty).Editable(false); 
      model.Field(c => c.BackorderedQty).Editable(false); 
     } 
     ) 
     .Sort(sort => 
     { 
      sort.Add(c => c.ItemDescription); 
     }) 

     .Events(events => 
     { 
      events.Error("KendoGridErrors");// Specify a handler for the error event 
      events.RequestEnd("onPackCartonGridComplete"); 
     } 
     ) 
     // CRUD configuration --> 
     //.Create(create => create.Action("Grid_SaveOrUpdate", "ManageWorkOrders", new { area = "OrderMgmt" }).Type(HttpVerbs.Post)) 
     .Read(read => read.Action("GetShipOrderDetails", "ManageShipOrders", new { area = "OrderMgmt", intOrderHeaderId = @Model.Id })// Specify the action method and controller name 
       .Type(HttpVerbs.Get) 
     ) 
     .Update(update => update.Action("CreateCartonAndPack", "ManageShippingContainers", new { area = "OrderMgmt" }).Type(HttpVerbs.Post)) 
     //.Destroy(destroy => destroy.Action("Grid_Delete", "ManageWorkOrders", new { area = "OrderMgmt" }).Type(HttpVerbs.Post)) 
     // <-- CRUD configuration 
    ) 
    .Sortable() 
)  

ответ

0

Придумал это ... было просто в конце. Просто необходимо положить в e.preventDefault();

function shipOrderDtlsGrid_OnSave(e) { 
    if (e.values.QtyToPack > e.model.RemainingToPack) { 
     e.preventDefault(); 
     alert("ERROR! You cannot pack more than is Remaining To Pack."); 
     return; 
    } 
} 
Смежные вопросы