Kendo Combobox服务器过滤器的技术问题



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

组合框显示客户号码和名称为显示文本。当用户键入几个字符时,我正在尝试实现过滤。从技术上讲,我在这里有两个问题。第一个是如何将滤波器文本传递给控制器。我已经写了一个JavaScript函数来返回过滤后的文本,但已经将数据属性设置为另一个称为GetSalesofficeFilter的函数。

我遇到的第二个问题是,该过滤器位于串联字段名称1和我的视图模型的客户数量上,而我编写的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()
        };
    }

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

在此处如何做kendo-way的示例:

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));
  }
}

查看文档

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

最新更新