kendo AutoComplete期望JSON响应包含与搜索过滤器相同的属性名称

时间:2013-11-16 18:17:03

标签: json filter kendo-ui kendo-autocomplete

数据源定义为:

var KendoDataSource_EmployeeAutoCompleteByFirstName = {
    serverFiltering: true,
    serverPaging: true,
    serverSorting: true,
    pageSize: 10,
    transport: {
        read: {
            url: '@Url.Action("GetEmployeesByFirstName", "Employee")',
            dataType: "json"
        }
    }
};

自动完成定义为:

function KendoGridFilterAutoComplete(element, kendoDataSource, textField) {
    element.kendoAutoComplete({
        minLength: 3,
        filter: "startswith",
        dataSource: kendoDataSource,
        dataTextField: textField
    });
}

使用kendoAutoComplete小部件时,数据源发送的过滤器如下:

filter[logic]=and&
filter[filters][0][value]=smith&
filter[filters][0][operator]=startswith&
filter[filters][0][field]=LastName&
filter[filters][0][ignoreCase]=true

来自服务器的JSON响应如下:

[
    {"First":"Bill","LastName":"Smith"},
    {"First":"Jack","LastName":"Smith"},
    {"First":"ABC","LastName":"Smithy"}
]

这样可以正常工作,但是你可以看到我返回多个条目,因此kendoAutoComplete显示两个相同的条目(Smith),因为名字不同。

所以我真正想要的是在服务器上做不同的,并且只返回可能的LastName,作为这样的字符串数组:

[
    "Smith",
    "Smithy"
]

但是kendoAutoComplete无法处理这个问题。它显示“未定义”或错误。

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我创建了以下代码:

#region AutoComplete
public virtual IQueryable GetAutoComplete(KendoGridRequest request)
{
    // Get filter from KendoGridRequest (in case of kendoAutoComplete there is only 1 filter)
    var filter = request.FilterObjectWrapper.FilterObjects.First();

    // Change the field-name in the filter from ViewModel to Entity
    string fieldOriginal = filter.Field1;
    filter.Field1 = MapFieldfromViewModeltoEntity(filter.Field1);

    // Query the database with the filter
    var query = Service.AsQueryable().Where(filter.GetExpression1<TEntity>());

    // Apply paging if needed
    if (request.PageSize != null)
    {
        query = query.Take(request.PageSize.Value);
    }

    // Do a linq dynamic query GroupBy to get only unique results
    var groupingQuery = query.GroupBy(string.Format("it.{0}", filter.Field1), string.Format("new (it.{0} as Key)", filter.Field1));

    // Make sure to return new objects which are defined as { "FieldName" : "Value" }, { "FieldName" : "Value" } else the kendoAutoComplete will not display search results.
    return groupingQuery.Select(string.Format("new (Key as {0})", fieldOriginal));
}

public virtual JsonResult GetAutoCompleteAsJson(KendoGridRequest request)
{
    var results = GetAutoComplete(request);
    return Json(results, JsonRequestBehavior.AllowGet);
}
#endregion

返回一个唯一的匿名对象列表,看起来像{“LastName”:“a”}。