Kendo DropDownList始终将相同的值从视图传递给控制器

时间:2018-03-20 21:45:16

标签: javascript c# kendo-grid

早上好/下午/晚上,我为不便之处道歉。

我有以下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传递值,但值仍然相同......

任何帮助将不胜感激。 提前致谢。

1 个答案:

答案 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_idacp_id正确地从视图发送到控制器:D和每次触发网格中的“READ”事件,内容正确显示。这是我的工作方式。

干杯。