1

Во-первых: Я нашел несколько вопросов для этого, и до сих пор ни один из ответов не работает для меня. На самом деле, я еще не нашел ответ !Kendo Grid - Обновление Datasource, не попавшее в контроллер

У меня есть приложение MVC 4, страница cshtml и несколько слоев частичных представлений под ним.

Main View (кендо вкладка, не элемент формы, бурение вниз на вкладке # 1):

<div class="container-fluid" style="margin-left: 10px; margin-right: 10px; padding-right: 30px;"> 
    @(Html.Kendo().TabStrip() 
      .Name("tabStrip") 
      .Events(e => e.Select("tabstrip_select")) 
      .Items(items => 
      { 
       items.Add() 
        .Text("Clone Assembly") 
        .Selected(true) 
        .Content(@<text>@Html.Partial("_Assembly", Model)</text>); 
       items.Add() 
        .Text("Submit") 
        .Visible(@Model.Status == (int)SessionStatuses.Started) 
        .HtmlAttributes(new { userWorkSessionId = Model.UserWorkSessionId }) 
        .LoadContentFrom("_AssemblyStarted", "ProductReuse", new { userWorkSessionId = Model.UserWorkSessionId }); 
       items.Add() 
        .Text("Session Results") 
        .Visible(@Model.Status >= (int)SessionStatuses.Submitted) 
        .HtmlAttributes(new { userWorkSessionId = Model.UserWorkSessionId }) 
        .LoadContentFrom("_AssemblySubmitted", "ProductReuse", new { userWorkSessionId = Model.UserWorkSessionId }); 
      }) 
    ) 
</div> 

_assembly частичного вид (кендо сетка):

@using (Html.BeginForm("Assembly", "ProductReuse", FormMethod.Post, new {id = "frmStartScreen"})) 
{ 
    @Html.HiddenFor(m => m.Status) 
    @Html.HiddenFor(m => m.UserWorkSessionId) 

    <div class="row"> 
     <div class="panel panel-info"> 
      <div class="panel-heading"> 
       <div class="panel-heading text-center"> 
        <h2 class="pr">@string.Format("{0} | {1} | {2}", Model.GlobalPartNum, Model.CloneScopeDisplay, Model.StatusDisplay)</h2> 
       </div> 
      </div> 
      <div class="panel-body" style="margin-bottom: 10px; margin-top: 10px;"> 
       <div class="row"> 
        @(Html.Kendo().Grid<BomViewModel>() 
          .Name("bom-prGrid-kendoGrid") 
          .HtmlAttributes(new {@class = "prGrid"}) 
          .ClientRowTemplate("") 
          .Columns(columns => 
          { 
           if (Model.StatusDisplay.Equals("Started")) 
           { 
            columns.Command(cmd => cmd.Edit()).Width(80); 
           } 
           columns.Bound(g => g.BomId).Hidden(); 
           columns.Bound(g => g.IsEditable).Hidden(); 
           columns.Bound(g => g.Row).Width(75).Title("Row"); 
           columns.Bound(g => g.PartNum).Width(125).Title("DWG/<br/>Part No"); 
           columns.Bound(g => g.Qty).Width(80).HtmlAttributes(new {style = "text-align:center"}).Title("Qty"); 
           columns.Bound(g => g.ItemDesc).Width(350).Title("Description"); 
          }) 
          .DataSource(dataSource => dataSource 
           .Ajax() 
           .Model(model => 
           { 
            model.Id(g => g.Row); 
            model.Field(m => m.Row).Editable(false); 
           }) 
           .PageSize(100) 
           .Read(r => r.Action("GetCloneAssembly", "AjaxProductReuse").Data("ProductReuseGridReadData")) 
           .Update(u => u.Action("UpdateBomItem", "AjaxProductReuse").Type(HttpVerbs.Post)) 
           .Events(e => e.Error("ajax_error").Sync("dataSource_sync").Change("dataSource_change")) 
         ) 
          .Events(e => e.DataBound("onDataBound").Edit("onEdit")) 
          .Pageable(pager => pager 
           .Input(true) 
           .Numeric(true) 
           .Info(true) 
           .PreviousNext(true) 
           .Refresh(true) 
           .PageSizes(new int[] {100, 250, 500, 1000}) 
         ) 
          .ToolBar(toolbar => 
          { 
          toolbar.Template(
            @<text> 
             <div class="container-fluid otherElements" style="padding-top: 5px; padding-bottom: 5px;"> 
              @Html.Partial("_CloneAssembly", Model) 
             </div> 
            </text>); 
          }) 
          .Excel(excel => excel.FileName("ClonableBom.xlsx").Filterable(true).AllPages(true).ProxyURL(Url.Action("ExcelProxy", "AjaxProductReuse"))) 
          .Sortable() 
          .Scrollable() 
          .Filterable() 
          //.Editable(editable => editable.Mode(GridEditMode.PopUp).TemplateName("BOMForm").Window(w => w.Title("Manage BOM Item").Name("BOMForm"))) 
          .Editable(editable => editable.Mode(GridEditMode.PopUp).TemplateName("BOMForm")) 
          .Resizable(resizing => resizing.Columns(true)).Reorderable(reorder => reorder.Columns(true)) 
         ) 
       </div> 
      </div> 
     </div> 
    </div> 
} 

контроллера (получить/сообщение для главная страница):

[HttpGet] 
public ActionResult Assembly(int userWorkSessionId = int.MinValue) 
{ 
    var response = GetCachedCurrentWorkSession(userWorkSessionId); 
    return View(response); 
} 

[HttpPost] 
public ActionResult Assembly(AssemblyViewModel command) 
{ 
    var saveServiceCommand = _mapper.Map<WorkSessionModel>(command); 
    var serviceResponse = _productReuseService.ApplyGlobalSettingsCommand(saveServiceCommand); 
    var response = SaveCachedCurrentWorkSession(serviceResponse); 

    return View(response); 
} 

Ajax Controller (ручки DataSource чтения & обновления):

[HttpPost] 
public JsonResult UpdateBomItem([DataSourceRequest] DataSourceRequest request, [Bind(Prefix = "models")]BomViewModel bomViewModel) 
{ 
    var command = _mapper.Map<BomModel>(bomViewModel); 
    var commandResponse = _productReuseService.UpdateBomItem(command); 
    var response = _mapper.Map<List<BomViewModel>>(commandResponse); 
    return Json(ToDataSourceResult(response, request, modelState: ModelState)); 
} 

Все выглядит правильно по сравнению с несколькими демонстрациями на сайте Telerik. Тем не менее, я получаю странное поведение, когда я представить всплывающую форму для обновления: enter image description here

enter image description here

В обоих случаях вызов Ajax никогда не нарушал в моем коде (т.е. :, никаких доказательств того, что он на самом деле не вошли метод!) Когда я отламываюсь в методе POST сборки, модель пуста, инициализирована, но пуста.

Как выглядит он во втором экземпляре отправляет каждую строку в сетку для основного метода действия вместо обработчика ajax. И, в довершение всего, строки ошибок 401 в трассе выглядят так, что они нажимают GET вместо POST и отклоняются, поскольку GET ожидает только INT.

Мы несколько человек посмотрели на это сейчас, и никто из нас не знает, что может создать такое поведение.

Любые мысли?

+0

Код состояния HTTP 401 относится к конфигурации веб-сайта на сервере IIS. 401 возвращается веб-сервером, а не вашим кодом. – whipdancer

+0

Кроме того, если вы не укажете тип ajax, я считаю, что Kendo Datasource по умолчанию будет 'GET'. – whipdancer

+0

Для обновления данных datasource тип ajax устанавливается как POST. –

ответ

0

Я в конечном итоге изменения идентификатора связывания на источник данных:

.Model(model => 
{ 
    model.Id(g => g.Row); 
    model.Field(m => m.Row).Editable(false); 
}) 

изменен на:

.Model(model => 
{ 
    model.Id(g => g.BomId); 
}) 

Это неподвижную его. Хотя Row является уникальным int в коллекции, BomId является определенным PK в БД. Почему это должно изменить ситуацию, я не знаю. Однако, несмотря на то, что Kendo (и поддерживающая модель) ничего не знает о ПК, так как это POCO без информации о сущности.

Если кто-то из вас знает, почему это повлияло бы на это, мне было бы очень интересно объяснение!

+0

Рад, что вы нашли свой ответ. Вы должны принять это решение как ответ, так как он исправил вашу проблему. – whipdancer

+0

Я планирую. Не разрешается выбирать его как ответ в течение 24 часов. –

+0

Я не знал об этом ограничении. Хорошо знать. – whipdancer

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