【问题标题】:Populating kendo MVC combo box based on another kendo combobox基于另一个剑道组合框填充剑道 MVC 组合框
【发布时间】:2017-04-05 11:07:21
【问题描述】:

我正在尝试根据对另一个组合框的选择来填充一个组合框的值。我在 MVC 5 应用程序中使用 kendo mvc 组合框。就我而言,我正在尝试根据 SalesOrganisation 组合框的选择填充销售办公室组合框。为此,我需要调用 SalesOffice 组合的控制器方法并传递国家代码值。我已经为销售组织的下拉控件的更改事件编写了一个 ajax 方法。它调用控制器方法。我可以看到该方法正在触发,但是当我对 javascript 代码中的数据发出警报时,该值显示 [object] [object]。但是状态显示成功不知道出了什么问题。如何填充销售办公室下拉列表

组合框

  <div class="form-group">
                @Html.LabelFor(model => model.Company, htmlAttributes: new { @class = "control-label col-md-4" })
                <div class="col-md-6">
                    <div class="editor-field">
                        @(Html.Kendo().ComboBoxFor(model => model.Company)
                            .Name("SalesOrganisation")
                            .HtmlAttributes(new { style = "width:300px" })
                            .DataTextField("Company")
                            .DataValueField("CountryCode")

                            .DataSource(dataSource => dataSource
                            .Read(read => read.Action("RequestHeader_SalesOrganisation", "Request").Type(HttpVerbs.Post))

                            )
                             .Events(e =>
                             {
                                 e.Change("onChange");
                             })
                        )
                    </div>
                    @Html.ValidationMessageFor(model => model.Company, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="clearfix"></div>
            <div class="form-group">
                @Html.LabelFor(model => model.SalesOffice, htmlAttributes: new { @class = "control-label col-md-4" })
                <div class="col-md-6">
                    <div class="editor-field">
                        @(Html.Kendo().ComboBoxFor(model => model.SalesOffice)
                            .Name("SalesOffice")
                            .HtmlAttributes(new { style = "width:300px" })
                            .DataTextField("SalesOffice")
                            .DataValueField("SalesOfficeID")

                            .DataSource(dataSource => dataSource
                            .Read(read => read.Action("RequestHeader_SalesOffice", "Request").Type(HttpVerbs.Post))
                            )
                        )
                    </div>
                    @Html.ValidationMessageFor(model => model.SalesOffice, "", new { @class = "text-danger" })
                </div>
            </div>

SalesOffice 控制器方法

    public ActionResult RequestHeader_SalesOffice(string id)
            {
                var response = requestRepository.GetSalesOffice(id).AsQueryable().ProjectTo<SalesOfficeViewModel>();

                var jsonResult = Json(response, JsonRequestBehavior.AllowGet);
                jsonResult.MaxJsonLength = int.MaxValue;
                return jsonResult;
            }

jQuery

 function onChange() {

        alert($('#SalesOrganisation').val());

        var ServiceUrl = "/CC.GRP.MCRequest/Request/RequestHeader_SalesOffice?id=" + $('#SalesOrganisation').val();
        var content = '';
        $.support.cors = true;

        $.ajax({
            type: 'Post',
            url: ServiceUrl,
            async: true,
            cache: false,
            crossDomain: true,
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            error: function (xhr, err) {
            },
            success: function (data, status) {
                $('#SalesOffice').val(data);
                alert(data);
                alert(status);
            }
        });
    }

【问题讨论】:

  • 你看过这个例子来了解如何做级联组合的demos.telerik.com/kendo-ui/combobox/cascadingcombobox
  • 您分享的示例是使用 odata。在我的代码中,我试图调用确实被触发的控制器操作方法。我可以看到它在服务器端获取数据。我的问题是如何在客户端获取该 json 数据并绑定它
  • 您要触发的更改事件是获取组合框列表中的值还是拉回新的select 列表以绑定到组合框?
  • 它应该绑定新的选择列表。它调用我的控制器代码,该代码包含在帖子中。它根据国家代码过滤列表。它应该将过滤后的列表绑定到组合框。我不确定进行 Ajax 调用是否正确。欢迎任何更好的实施。如果不是想知道为什么我当前的代码没有捕获列表。

标签: jquery asp.net-mvc kendo-ui kendo-combobox


【解决方案1】:

所以根据您的具体情况。顶部组合框应控制来自第二个组合框的选择项。在这种情况下,使用组合框的cascading 功能将是最简单的方法,并且还可以减少您拥有的代码量。

所以我们可以摆脱顶部的组合框更改事件。

第二个我们稍微改成这样:

@(Html.Kendo().ComboBoxFor(model => model.SalesOffice)
                            .Name("SalesOffice")
                            .HtmlAttributes(new { style = "width:300px" })
                            .DataTextField("SalesOffice")
                            .DataValueField("SalesOfficeID")

                            .DataSource(dataSource => dataSource
                                .Read(read =>
                                {
                                    read.Action("RequestHeader_SalesOffice", "Request")
                                        .Type(HttpVerbs.Post)
                                        .Data("GetFilterOption"); <-- This Bit
                                })
                                ).CascadeFrom("SalesOrganisation") //<--This Bit

)

然后我们添加名为GetFilterOption 的javascript 函数,它会从您的顶部组合框中返回选定的值。

function GetFilterOption(){
    return { id: $('#SalesOrganisation').val() }

}

这将返回新的结果集,以便您绑定到组合框,并允许您从新收集的结果中选择值。

您当前的解决方案不起作用的原因是您要恢复选择列表并将其绑定到值而不是基础数据源。

因此,如果您只想更改 javascript 代码,您可以执行以下操作:

success: function (data, status) {
              //  $('#SalesOffice').val(data); <-- FROM THIS TO
                $('#SalesOffice').data('kendoComboBox').setDataSource(data); 
                alert(data);
                alert(status);
            }

希望这能回答您的问题。任何问题让我知道,我会更新答案以反映任何变化。

编辑

在通过聊天与 Tom 反复试验后,我们找到了添加 .Filtering("Contains") 的解决方案

然后是组合框中的 .ServerFiltering(true) ,所以最后是这样的:

@(Html.Kendo().ComboBoxFor(model => model.SalesOffice)
                            .Name("SalesOffice")
                            .HtmlAttributes(new { style = "width:300px" })
                            .DataTextField("SalesOffice")
                            .DataValueField("SalesOfficeID")
                            .Filter("Contains")
                            .DataSource(dataSource => dataSource
                                .Read(read =>
                                {
                                    read.Action("RequestHeader_SalesOffice", "Request")
                                        .Type(HttpVerbs.Post)
                                        .Data("GetFilterOption"); <-- This Bit
                                })
                                 .ServerFiltering(true)
                                ).CascadeFrom("SalesOrganisation") //<--This Bit

)

【讨论】:

  • 很奇怪。我添加了你的代码。它确实在我的控制器方法中使用正确的 id 到达断点。该方法返回记录,但我的组合框未绑定。它显示没有数据绑定。
  • 当您返回数据时,它是否具有您为组合定义的属性?当您使用提琴手/浏览器工具查看响应时,调用的响应是什么?
  • 我没有firefox看fiddler。使用铬。你的意思是chrome中的开发者工具。我在哪里检查
  • 在 chrome 中转到网络选项卡。然后您将看到呼叫,如果成功,它会发回什么。
  • 我可以看到数据。 SalesOfficeID:38,SalesOfficeCode:“XX”,SalesOffice:“”},...] 0:{SalesOfficeID:38,SalesOfficeCode:“XX”,SalesOffice:“”} 1:{SalesOfficeID:37,SalesOfficeCode:“5117”,SalesOffice :“国际”} 2:
【解决方案2】:
[{SalesOfficeID: 58, SalesOfficeCode: "XX", SalesOffice: ""},…]
0
:
{SalesOfficeID: 58, SalesOfficeCode: "XX", SalesOffice: ""}
1
:
{SalesOfficeID: 57, SalesOfficeCode: "8118", SalesOffice: "T&T"}
2
:
{SalesOfficeID: 56, SalesOfficeCode: "8117", SalesOffice: "International"}
3
:
{SalesOfficeID: 55, SalesOfficeCode: "8116", SalesOffice: "Central"}
4
:
{SalesOfficeID: 54, SalesOfficeCode: "8115", SalesOffice: "CS Coverage"}
5
:
{SalesOfficeID: 53, SalesOfficeCode: "8114", SalesOffice: "CS South"}
6
:
{SalesOfficeID: 52, SalesOfficeCode: "8113", SalesOffice: "CS Scotland"}
7
:
{SalesOfficeID: 51, SalesOfficeCode: "8112", SalesOffice: "CS North"}
8
:
{SalesOfficeID: 50, SalesOfficeCode: "8111", SalesOffice: "CS Major Accounts"}
9
:
{SalesOfficeID: 49, SalesOfficeCode: "8110", SalesOffice: "CS London"}
10
:
{SalesOfficeID: 48, SalesOfficeCode: "8109", SalesOffice: "IAM - PS"}
11
:
{SalesOfficeID: 47, SalesOfficeCode: "8108", SalesOffice: "IAM - I&C"}
12
:
{SalesOfficeID: 46, SalesOfficeCode: "8107", SalesOffice: "Edinburgh"}
13
:
{SalesOfficeID: 45, SalesOfficeCode: "8106", SalesOffice: "Manchester"}
14
:
{SalesOfficeID: 44, SalesOfficeCode: "8105", SalesOffice: "Blackfriars FM"}
15
:
{SalesOfficeID: 43, SalesOfficeCode: "8104", SalesOffice: "Blackfriars FMR"}
16
:
{SalesOfficeID: 42, SalesOfficeCode: "8103", SalesOffice: "Reading"}
17
:
{SalesOfficeID: 41, SalesOfficeCode: "8102", SalesOffice: "Hatfield BTSI"}
18
:
{SalesOfficeID: 40, SalesOfficeCode: "8101", SalesOffice: "Hatfield PS"}
Name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多