早上好/下午/晚上,我为不便之处道歉。
我有以下kendo子网格,其中包含一个带有选项的简单下拉列表:
<script id="subgrid" type="text/kendo-tmpl">
@(Html.Kendo().Grid<AccrualProfileDetailsModel>()
.Name("grid_#=acrpr_id#")
.Columns(columns =>
{
columns.Bound(c => c.acrpr_id).Hidden();
columns.Bound(c => c.acp_id).Hidden();
columns.Bound(c => c.pc_name).Title(Resource.PayCode);
columns.ForeignKey(c => c.acr_function, StaticLists.GetAccrualCodeFunction(), "Value", "Description")
.Title(Resource.Type);
columns.Command(command =>
{
command.Edit().Text(" ").HtmlAttributes(new { title = Resource.Edit + " " + Resource.AccrualProfile }).UpdateText(" ").CancelText(" ");
}).Width("10%");
})
.Editable(editable => editable.Mode(GridEditMode.InLine))
.Pageable()
.ToolBar(t =>
{
t.Template(
@<text>
<div style="display:inline">
@(Resource.Select + " " + Resource.AccrualCode + " "):
@(Html.Kendo().DropDownList()
.Name("accrualProfileDetails_#=acrpr_id#")
.DataValueField("acp_id")
.DataTextField("acp_name")
.BindTo(AccrualCodes)
.Events(ev => ev.Change("function(args) {accrualProfileDetailsDrpDwnChange(args, 'grid_#=acrpr_id#');}"))
.ToClientTemplate()
)
</div>
</text>);
})
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(10)
.Model(model =>
{
model.Id(p => p.acrpr_id);
model.Field(p => p.acr_function).Editable(true);
model.Field(p => p.pc_name).Editable(false);
})
.Read(read => read.Action("ReadAccrualProfilesDetails", "AccrualProfiles").Data("GetSubGridParams(#=acrpr_id#)"))
.Update(update => update.Action("UpdateAccrualProfileDetail", "AccrualProfiles"))
)
.Events(ev => ev.Save("function(e) {getDropDownListValue(e, #=acrpr_id#)}"))
.ToClientTemplate()
)
每次DropDownList的值发生更改时,它都会触发一个刷新子网格中存在的记录的读取事件。 触发读取事件的函数如下:
function accrualProfileDetailsDrpDwnChange(e, gridId) {
var grid = $("#" + gridId).data("kendoGrid");
grid.dataSource.read();
}
如果你看到这一行:
.Read(read => read.Action("ReadAccrualProfilesDetails", "AccrualProfiles").Data("GetSubGridParams(#=acrpr_id#)"))
READ事件附加了一个名为GetSubGridParams
的函数,理论上应该执行以下操作:
function GetSubGridParams(acrpr_id) {
var acp_id = $('#accrualProfileDetails_' + acrpr_id).data().kendoDropDownList.value();
return {
acrpr_id: acrpr_id,
acp_id: acp_id
};
}
它捕获网格中的id以及将作为参数传递给控制器的DropDownList的值。
问题在于每次DropDownList的值发生变化时,传递给控制器的值总是相同的,从DropDownList中选择哪个选项并不重要。我正在网上和Telerik文档上搜索,但建议的解决方案总是一样的,但这些解决方案对我不起作用。
我的问题很简单:我需要向控制器传递DropDownList的选定值,这是GetSubGridParams
函数没有做的事情。
注意
我看到最好创建DropDownListFor而不是简单的DropDownList并将其绑定到模型中的属性,但正如您所看到的,我无法做到这一点,因为DropDownList是在模板内部,模型将无法识别。或者我可能不知道该如何识别该模板中的模型,最终......而且,我尝试使用ajax传递值,但值仍然相同......
任何帮助将不胜感激。 提前致谢。
答案 0 :(得分:0)
经过多次测试,我得到了这个功能。
我通过附加到DropDownList的“更改”事件(accrualProfileDetailsDrpDwnChange
函数将传递的数据从View传递到Controller。删除GetSubGridParams
因为它无法正常工作后,我编辑了accrualProfileDetailsDrpDwnChange
函数,如下所示:
function accrualProfileDetailsDrpDwnChange(e, gridId, acrpr_id) {
var grid = $("#" + gridId).data("kendoGrid");
var acp_id = $('#accrualProfileDetails_' + acrpr_id).data().kendoDropDownList.value();
var url = '@Url.Action("ReadAccrualProfilesDetails", "AccrualProfiles")' + "?acrpr_id=" + acrpr_id + "&acp_id=" + acp_id;
grid.dataSource.transport.options.read.url = url;
grid.dataSource.read();
}
最重要的部分是:
var url = '@Url.Action("ReadAccrualProfilesDetails", "AccrualProfiles")' + "?acrpr_id=" + acrpr_id + "&acp_id=" + acp_id;
grid.dataSource.transport.options.read.url = url;
grid.dataSource.read();
将URL设置为网格后,参数acrpr_id
和acp_id
正确地从视图发送到控制器:D和每次触发网格中的“READ”事件,内容正确显示。这是我的工作方式。
干杯。