2015-07-16 2 views
0

Моя сетка отредактирована в встроенном режиме. очевидно, когда kendo не обнаруживает изменения в строке d, событие обновления не будет запущено. Мне нужно вызвать событие обновления, даже если в строке не было внесено никаких изменений, потому что изменение будет обработано в d-контроллере.вручную Установить Kendo asp.net строка сетки mvc для обновления

Я нашел этот пост Manual row change, но я не знаю, как это сделать. im, используя kendo mvc, а не kendo js.

мой взгляд

@(Html.Kendo().Grid<OrderViewModel>() 
 
     .Name("orders") 
 
       .HtmlAttributes(new { style = "height: 700px; border: 0;" }) 
 
     .Scrollable() 
 
     .Columns(columns => 
 
     { 
 
      columns.Template(t => { }) 
 
       .ClientTemplate("#=OrderID#") 
 
       .Title("ORDER ID") 
 
       .Width(120); 
 
      columns.Bound(f => f.OrderDate) 
 
       .Title("ORDER DATE") 
 
       .Format("{0:d}") 
 
       .Width(150); 
 
      columns.Bound(f => f.RequiredDate) 
 
       .Title("REQUIRED DATE") 
 
       .Format("{0:d}") 
 
       .Width(150); 
 
      columns.ForeignKey(f => f.CustomerID, (System.Collections.IEnumerable)ViewData["customers"], "CustomerID", "CompanyName") 
 
       .Title("REQUEST BRANCH") 
 
       .Width(200); 
 
      columns.ForeignKey(f => f.ShipVia, (System.Collections.IEnumerable)ViewData["shippers"], "ShipperID", "CompanyName") 
 
       .Title("CMU") 
 
       .Width(150); ; 
 
      columns.ForeignKey(f => f.EmployeeID, (System.Collections.IEnumerable)ViewData["employees"], "EmployeeID", "EmployeeName") 
 
       .Title("REQUESTED BY") 
 
       .Width(250); 
 
      columns.Bound(f => f.ShipCountry) 
 
       .Title("ORDER STATUS") 
 
       .ClientTemplate("<div class='country #=ShipCountry#'></div>#=ShipCountry#") 
 
       .Width(150); 
 
      columns.Command(commands => 
 
      { 
 
       commands.Edit() 
 
       .Text("Approve Order") 
 
       .UpdateText("Approve") 
 
       .CancelText("Cancel"); 
 

 
      }).Width(200); 
 
     }) 
 
     .Editable(e => e.Mode(GridEditMode.InLine)) 
 
     .Events(e => e 
 
      .DataBound("onDataBound") 
 
     ) 
 
     .Pageable(pageable => pageable.Refresh(true)) 
 
     .Sortable() 
 
     .Selectable() 
 
     .Navigatable() 
 
     .Filterable() 
 
     .ClientDetailTemplateId("Order_DetailTemplate") 
 
     .DataSource(dataSource => dataSource 
 
      .Ajax() 
 
      .PageSize(20) 
 
      .Model(m => 
 
      { 
 
       m.Id(f => f.OrderID); 
 
       m.Field(f => f.OrderID).DefaultValue(-42); 
 
       m.Field(f => f.OrderID).Editable(false); 
 
       m.Field(f => f.OrderDate).Editable(false); 
 
       m.Field(f => f.CustomerID).Editable(false); 
 
       m.Field(f => f.EmployeeID).Editable(false); 
 
       m.Field(f => f.ShipCountry).Editable(false); 
 
        
 
       m.Field(f => f.ShipVia).Editable(false); 
 
        
 
       
 
      }) 
 
      .Events(e => e.Error(@<text> 
 
       function (e) { 
 
       onError(e, "orders"); 
 
       } 
 
      </text>)) 
 
            .Sort(s => s.Add(f => f.OrderDate).Descending()) 
 
            .Read("Orders_Read", "Orders") 
 

 
            .Update("Orders_Approve", "Orders") 
 
            
 
           ) 
 
    ) 
 
    @{ 
 
     Func<object, object> errorEvent = @<text> 
 
      function(e) { 
 
      if (e.errors) { 
 
      onError(e, "order_details#=OrderID#"); 
 
      } 
 
      } 
 
     </text>; 
 
    } 
 
    <script id="Order_DetailTemplate" type="text/x-kendo-tmpl"> 
 
     <h4>Details for order \\##=OrderID# </h4> 
 
     @(Html.Kendo().TabStrip() 
 
     .Name("order_details_tabstrip_#=OrderID#") 
 
     .Items(items => 
 
     { 
 
      items.Add() 
 
       .Text("CURRENCIES") 
 
       .Selected(true) 
 
       .Content(@<text> 
 
        @(Html.Kendo().Grid<OrderDetailViewModel>() 
 
        .Name("order_details#=OrderID#") 
 
        
 
        .Columns(columns => 
 
        { 
 
         columns.ForeignKey(f => f.ProductID, (System.Collections.IEnumerable)ViewData["products"], "ProductID", "ProductName") 
 
          .Title("CURRENCY NAME") 
 
          .EditorTemplateName("CustomGridForeignKey"); 
 
         columns.Bound(f => f.UnitPrice) 
 
          .Format("{0:c}") 
 
          .Title("UNIT PRICE") 
 
          .Width(220); 
 
         columns.Bound(f => f.Quantity) 
 
          .Title("AMOUNT") 
 
          .Width(220) 
 
          .ClientFooterTemplate("Grand total:"); 
 
         columns.Template(f => new { }) 
 
          .Title("TOTAL") 
 
          .ClientTemplate("\\#=kendo.toString(GetOrderItemPrice(data), \"c\")\\#") 
 
          .ClientFooterTemplate("<span name='sum'></span>").Width(120); 
 

 
        }) 
 
        .Events(e => 
 
        { 
 
         e.DataBound("onOrderDetailsDataBound"); 
 
         e.DetailInit("onDetailInit"); 
 
         e.Edit("onOrderDetailsEdit"); 
 
        }) 
 
        .Selectable() 
 
        .Pageable(pageable => pageable.Refresh(true)) 
 
        .Navigatable() 
 
        .ClientDetailTemplateId("Product_DetailTemplate") 
 
        .DataSource(dataSource => dataSource 
 
         .Ajax() 
 
         .Model(model => 
 
         { 
 
          model.Id(detail => detail.OrderDetailID); 
 
         }) 
 
         .Events(e => e.Error(errorEvent)) 
 
         .Read("OrderDetails_Read", "OrderDetails", new { OrderID = "#=OrderID#" }) 
 
         
 
        ).ToClientTemplate() 
 
        )</text>); 
 
      items.Add() 
 
       .Text("MOVEMENT DETAILS") 
 
       .Content(@<text> 
 
        <div class='shipping-details'> 
 
         <ul> 
 
          <li><label>Name:</label>#= ShipName #</li> 
 
          <li><label>OrderStatus:</label>#= ShipCountry #</li> 
 
          <li><label>City:</label>#= ShipCity #</li> 
 
          <li><label>Address:</label>#= ShipAddress #</li> 
 
          <li><label>Postal Code:</label>#= ShipPostalCode #</li> 
 
         </ul> 
 
        </div> 
 
       </text>); 
 
     }) 
 
                     .ToClientTemplate() 
 
     ) 
 
    </script>

и мой контроллер:

public ActionResult Orders_Approve([DataSourceRequest]DataSourceRequest request, OrderViewModel order) 
 
     { 
 
      if (ModelState.IsValid) 
 
      { 
 
       using (var northwind = new NCashEntities()) 
 
       { 
 
        var entity = northwind.ORDERS.FirstOrDefault(o => o.ORDERID == order.OrderID); 
 
        if (entity == null) 
 
        { 
 
         string errorMessage = string.Format("Cannot update record with OrderID:{0} as it's not available.", order.OrderID); 
 
         ModelState.AddModelError("", errorMessage); 
 
        } 
 
        else 
 
        { 
 
         entity.CUSTOMERID = order.CustomerID; 
 
         entity.EMPLOYEEID = order.EmployeeID; 
 
         entity.ORDERDATE = order.OrderDate; 
 
         entity.SHIPCOUNTRY = "Approved"; 
 
         entity.SHIPVIA = order.ShipVia; 
 
         entity.SHIPPEDDATE = order.ShippedDate; 
 
         entity.SHIPNAME = order.ShipName; 
 
         entity.SHIPADDRESS = order.ShipAddress; 
 
         entity.SHIPCITY = order.ShipCity; 
 
         entity.SHIPPOSTALCODE = order.ShipPostalCode; 
 

 
         northwind.ORDERS.Attach(entity); 
 
         northwind.Entry(entity).State = System.Data.Entity.EntityState.Modified; 
 
         northwind.SaveChanges(); 
 
        } 
 
       } 
 
      } 
 
      return Json(new[] { order }.ToDataSourceResult(request, ModelState)); 
 
     }

+0

Почему вы хотите что-то сэкономить, если ничего не изменилось? Вы хотите, чтобы это поведение по умолчанию для всех изменений для этой сетки? –

+0

Спасибо, Дэвид, посмотри на это так ... это похоже на одобренный вид заказа. одобрение ничего не изменит в заказе. Но статус будет изменен на «Approved» в контроллере. Это поведение по умолчанию для всех изменений для этой конкретной сетки. – Laolu

ответ

2

Хорошо здесь один из способов потенциально делать то, что вы хотите делать.

Если добавить обработчик события к событию редактирования пути добавления

это к вашей сетке (добавление к существующему событию вы имеете права на ошибку)

e.Edit("onEdit"); 

затем добавив яваскрипт функции следующим образом:

function onEdit(e){ 
e.model.dirty= true; 
} 

это должно установить для вас грязный флаг и позволить вам обновить модель.

Хотя это можно сделать. Я лично думаю, что вам лучше привязать это действие «одобрить» к кнопке или сделать ее доступной. На всякий случай кто-то случайно одобрит один из ваших заказов, когда вы не хотите, чтобы он был одобрен. Но это так, как я думал об этом типе «бизнес-логики».

Любые вопросы, дайте мне знать, и я соответствующим образом настрою код.

+0

я добавил .Events (е => { e.Error (@ функции (е) { OnError (е, "Заказы");} ); e.Edit ("onEdit"); }), но он ошибочно «Kendo.Mvc.UI.Fluent.DataSourceEventBuilder» не содержит определения «Редактировать» и никакого расширения .... ».Если добавить его .Events (e => { e. DataBound ("onDataBound"); e.Edit ("onEdit"); }) ..... это работает, но ничего не меняется. Событие не попадает, когда я отлаживаю js. – Laolu

+0

Привет @Laolu Я исправил свой Код сейчас. Вам просто нужно установить 'e.model.dirty', а не isDirty. Я протестировал этот ou t с образцом проекта, и вызов обновления выполнялся, как ожидалось. –

+0

Прохладный. это сработало! Спасибо @David Shorthose – Laolu

Смежные вопросы