Во-первых: Я нашел несколько вопросов для этого, и до сих пор ни один из ответов не работает для меня. На самом деле, я еще не нашел ответ !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. Тем не менее, я получаю странное поведение, когда я представить всплывающую форму для обновления:
В обоих случаях вызов Ajax никогда не нарушал в моем коде (т.е. :, никаких доказательств того, что он на самом деле не вошли метод!) Когда я отламываюсь в методе POST сборки, модель пуста, инициализирована, но пуста.
Как выглядит он во втором экземпляре отправляет каждую строку в сетку для основного метода действия вместо обработчика ajax. И, в довершение всего, строки ошибок 401 в трассе выглядят так, что они нажимают GET вместо POST и отклоняются, поскольку GET ожидает только INT.
Мы несколько человек посмотрели на это сейчас, и никто из нас не знает, что может создать такое поведение.
Любые мысли?
Код состояния HTTP 401 относится к конфигурации веб-сайта на сервере IIS. 401 возвращается веб-сервером, а не вашим кодом. – whipdancer
Кроме того, если вы не укажете тип ajax, я считаю, что Kendo Datasource по умолчанию будет 'GET'. – whipdancer
Для обновления данных datasource тип ajax устанавливается как POST. –