Asp.net mvc 4 在列值更改时更新剑道网格行

Asp.net mvc 4 在列值更改时更新剑道网格行,asp.net-mvc-4,kendo-ui,Asp.net Mvc 4,Kendo Ui,我正在使用Kendo MVC控件开发一个MVC.Net Framework v4.5站点。其中一个页面使用绑定到视图模型的剑道网格。当我编辑一行时,有一个字段使用dropdownlist控件,当选择更改时,该行中的其余字段应更新以反映新选择的项目。我使用JSON调用来执行此操作,然后返回用于该行的新视图模型。但是,我不知道如何告诉网格使用从JSON调用返回的数据。有什么想法吗 编辑: 我附上了一些代码。现在的问题是,我可以让网格的数据源“刷新”,但在grid.datasource.read()行

我正在使用Kendo MVC控件开发一个MVC.Net Framework v4.5站点。其中一个页面使用绑定到视图模型的剑道网格。当我编辑一行时,有一个字段使用dropdownlist控件,当选择更改时,该行中的其余字段应更新以反映新选择的项目。我使用JSON调用来执行此操作,然后返回用于该行的新视图模型。但是,我不知道如何告诉网格使用从JSON调用返回的数据。有什么想法吗

编辑:

我附上了一些代码。现在的问题是,我可以让网格的数据源“刷新”,但在grid.datasource.read()行的UpdateGridSource jscript函数中,网格现在已脱离编辑模式,如果我去编辑行,数据将恢复到原来的状态

(视图)

@(Html.Kendo().Grid())
.名称(“报价单”)
.列(c=>
{
c、 绑定(p=>p.Id).Hidden();
c、 绑定(p=>p.Description).EditorTemplateName(“组合框”);
c、 绑定(p=>p.ItemQty);
c、 绑定(p=>p.ItemPrice).Format(“{0:c}”);
c、 绑定(p=>p.Total).ClientTemplate(“#=kendo.format('{0:c}',Total)#”).footerthMLattributes(new{style=“text align:right;”}).clientfootermplate('{0:c}',sum)#.HtmlAttributes(new style=“text align:right;”).Width(100);
c、 命令(cmd=>{cmd.Edit();cmd.Destroy();}).Title(“Commands”).Width(200);
})
.ToolBar(tb=>tb.Create())
.ClientDetailTemplateId(“子项”)
.Editable(eb=>eb.Mode(GridEditMode.InLine).CreateAt(GridInsertRowPosition.Bottom))
.Events(e=>e.Edit(“editGrid”))
.Scrollable()
.DataSource(ds=>ds
.Ajax()
.ServerOperation(错误)
.总计(a=>
{
a、 添加(p=>p.LineTotal).Sum();
a、 加(p=>p.Total).Sum();
})
.Model(Model=>
{
model.Id(p=>p.Id);
model.Field(p=>p.LineTotal).可编辑(false);
model.Field(p=>p.ItemPrice).可编辑(true);
})
.Read(Read=>Read.Action(“GridSelect”,“QuickQuote”,new{qqid=Model.Id})).ServerOperation(false)
.Create(Create=>Create.Action(“GridCreate”,“QuickQuote”,new{qqid=Model.Id}))
.Update(Update=>Update.Action(“GridUpdate”、“QuickQuote”))
.Destroy(Destroy=>Destroy.Action(“GridDelete”、“QuickQuote”))
)
)
功能下拉选择更改(e){
var dataItem=this.dataItem(e.item.index());
UpdateGridSource(dataItem.Value);
}
函数UpdateGridSource(DropDownValue){
var网格=$(“#网格”).data(“kendoGrid”);
grid.dataSource.transport.options.read.url='/Controller/refreshGridDataSource?selection='+DropDownValue;
grid.dataSource.read();
}
(控制员)

public JsonResult refreshQuickQuoteTest2([DataSourceRequest]DataSourceRequest请求,字符串选择)
{
QuickQuoteItem qqi=db.QuickQuoteItems.FirstOrDefault(p=>p.ItemID==selection);
QuickQuote quickQuoteOriginal=qqi.QuickQuote;
QuickQuoteItemView qqiv=新的QuickQuoteItemView();
i可数返回2;
qqiv.Id=qqi.Id;
qqiv.ItemID=qqi.ItemID;
qqiv.ItemPrice=qqi.ItemPrice;
if(会话[“quickQuote”]!=null)
{
QuickQuote qq=(QuickQuote)(会话[“QuickQuote”]);
if(会话[“editingQuickQuoteId”]!=null)
{
int row=Convert.ToInt32(会话[“editingQuickQuoteId]”);
foreach(qq.QuickQuoteItems中的变量项)
{
如果(item.Id==行)
{
QuickQuoteItem测试=新的QuickQuoteItem();
StandardItem stdItem=新的StandardItem();
stdItem=db.StandardItems.Find(选择);
item.ItemPrice=标准价格;
项目说明=标准项目说明;
item.ItemID=stdItem.ItemID;
}
}
}                
return2=QuickQuoteItemViewItems(qq);
}
其他的
{
return2=QuickQuoteItemViewItems(quickQuoteOriginal);
}
返回Json(return2.ToDataSourceResult(request),JsonRequestBehavior.AllowGet);
}

您可以使用网格Ajax绑定来调用控制器更新操作方法

.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(false)
.Model(model => model.Id(p => p.SampleId))
.Update(read => read.Action("SampleGrid_Update", "Controller")))
然后,您需要使用
DataSourceRequest
属性修饰methods-datasource参数,并将ModelState作为
DataSourceResult

 [HttpPost]
    public ActionResult SampleGrid_Update([DataSourceRequest] DataSourceRequest dsRequest, IEnumerable<SampleViewModel> viewModel)
    {
        if (viewModel != null && ModelState.IsValid)
        {
            // other code goes here...
        }

        return Json(ModelState.ToDataSourceResult());
    }

这里的问题是更新操作方法上不会出现这种情况。当下拉选择更改事件发生时,而不是更新行时,实际上需要刷新该行。在剑道网站网格示例中,只需使用下拉列表而不是绑定到某些产品的文本框来描绘“ProductName”列。当产品更改时,“单价”和“库存单位”列需要反映新选择的产品(根据产品下拉列表中选择的内容进行更改)…这说明了问题吗?编辑了我的答案,包括如何刷新网格数据源。你能发布一些代码让我们更好地理解这个问题吗?谢谢Longball,我已经添加了一些代码。我正在刷新网格数据源,但是当调用.datasource.read()时,网格将退出编辑模式,而在更改列值时不应该这样做。如果这是刷新行的唯一方法,那么在本例中读取数据源后,我需要一种变通方法将行重新置于“编辑”模式。我找到了一种使用弹出式编辑模式进行此工作的方法。使用弹出式编辑,我可以使用
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(false)
.Model(model => model.Id(p => p.SampleId))
.Update(read => read.Action("SampleGrid_Update", "Controller")))
 [HttpPost]
    public ActionResult SampleGrid_Update([DataSourceRequest] DataSourceRequest dsRequest, IEnumerable<SampleViewModel> viewModel)
    {
        if (viewModel != null && ModelState.IsValid)
        {
            // other code goes here...
        }

        return Json(ModelState.ToDataSourceResult());
    }
$("#gridId").data("kendoGrid").dataSource.read();