Kendo Grid - 数据源更新未击中控制器

时间:2016-05-18 19:36:08

标签: c# asp.net-mvc asp.net-mvc-4 kendo-grid kendo-asp.net-mvc

首先:我已经找到了几个问题,到目前为止,没有一个答案对我有用。事实上,我还没有找到接受的答案!

我有一个MVC 4应用程序,一个cshtml页面和几层局部视图。

主视图(kendo标签,没有表单元素,在标签#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(处理数据源读取和更新):

[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调用从未在我的代码中破坏(即:,没有证据表明它实际进入了方法!)当我在Assembly POST方法中休息时,模型为空,初始化但是为空。 / p>

它在第二个实例中的表现是将网格中的每个行发送到主操作方法而不是ajax处理程序。而且,最重要的是,跟踪中的401错误行看起来像是在击中GET而不是POST并被拒绝,因为GET只需要一个INT。

我们现在有几个人正在研究这个问题,而且我们都没有人知道可能会造成这种行为的原因。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我最终更改了数据源上的id绑定:

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

更改为:

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

这解决了它。虽然Row是集合中的唯一int,但BomId是DB中定义的PK。为什么这应该有所作为我不知道。然而,即使Kendo(和支持模型)对PK没有任何了解,它也是如此,因为它是一个没有实体信息的POCO。

如果你们中的任何一个人可能知道为什么会影响它,我会对解释感兴趣!