kendo组合框服务器过滤器

时间:2017-04-27 11:48:24

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

我在MVC 5应用程序中实现了具有级联功能的kendo组合框。我正在尝试实施服务器过滤并遇到障碍。

组合框显示连接为显示文本的客户编号和名称。我正在尝试实现过滤,因为用户键入了几个字符。我在技术上有两个问题。第一个是如何将过滤器文本传递给控制器​​。我编写了一个javascript函数来返回已过滤的文本,但已将data属性设置为另一个名为GetSalesOfficeFilter的函数。

我遇到的第二个问题是过滤器位于连接字段Name1和我的视图模型的客户编号上,而我编写的linq查询只能访问不包含连接字段的模型。我如何使这个工作?

<div class="form-group">
                    @Html.LabelFor(model => model.Name1, htmlAttributes: new { @class = "control-label col-md-4" })

                    <div class="col-md-8">
                        <div class="editor-field">
                            @(Html.Kendo().ComboBoxFor(model => model.CustomerMasterDataId)

                     .HtmlAttributes(new { style = "width:100%" })
                    .DataTextField("CustomerNumberName")
                    .Placeholder("Select...")
                    .DataValueField("CustomerMasterDataId")
                    .Filter("contains")
                    .MinLength(3)
                    .DataSource(dataSource => dataSource
                          .Read(read =>
                          {
                              read.Action("RequestHeader_CustomerData", "Request")
                                  .Type(HttpVerbs.Post)
                                  .Data("GetSalesOfficeFilter");
                          }).ServerFiltering(true)
                                    ).CascadeFrom("CountryCode").Filter("contains")

                       .Events(e =>
                       {
                           e.Change("onCustomerComboChange");
                       })
                            )
                        </div>
                        @Html.ValidationMessageFor(model => model.Name1, "", new { @class = "text-danger" })
                    </div>
                </div>

控制器

 public ActionResult RequestHeader_CustomerData(string id,string filter)
        {
            var response = requestRepository.GetCustomerData(id).AsQueryable().Where(i => i.Name1.Contains(filter)).ProjectTo<CustomerViewModel>();

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

的javascript

function GetSalesOfficeFilter() {

    return { id: $('#CountryCode').val() }
};


function onAdditionalData() {
        return {
            filter: $("#Name1").data("kendoComboBox").text()
        };
    }

1 个答案:

答案 0 :(得分:0)

您应该使用Kendo Dinamic Linq库进行服务器过滤。 但是对于正确的工作,你不能使用映射器或可以实现查询的东西。

这里有关于你如何做剑道的例子:

using Kendo.DynamicLinq;

public class EmployeesController : Controller {

  [HttpPost]
  public ActionResult Get(int take, int skip, IEnumerable<Kendo.DynamicLinq.Sort> sort, Kendo.DynamicLinq.Filter filter) {
    var employees = _context.Employees.OrderBy(e => e.Employee_ID)
      .OrderBy(e => e.Employee_ID)
      .Select(e => new Models.Employee {
        EmployeeID = e.Employee_ID,
        FirstName = e.First_Name,
        LastName = e.Last_Name,
        Title = e.Title,
        BirthDate = e.Birth_Date
    });

    return Json(employees.ToDataSourceResult(take, skip, sort, filter));
  }
}

查看docs

但如果您不能或不会使用新库,还有另一种方法。 在向服务器发送请求之前,您可以在客户端上的parametrMap function中解析过滤器,并仅发送一个您将在服务器上处理的参数。