我在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()
};
}
答案 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中解析过滤器,并仅发送一个您将在服务器上处理的参数。