サーバー側で Kendo UI ComboBox のフィルタリングを処理しようとしています。ビューに次のコードがあります
$('#Solicitor').kendoComboBox({
placeholder: "@T("Enter the partial Name or Primary ID of the Entity.").Text",
dataTextField: "text",
dataValueField: "id",
autoBind: false,
minLength: 3,
filter: "startswith",
dataSource: {
serverFiltering: true,
transport: {
read: {
url: "@Url.Action("Index", "EntitiesAdmin", new { area = "BizNet.Entity"})",
dataType: "json"
}
}
}
});
ComboBox に何かを入力したとき。CAR、Fiddler2 を使用すると、次のクエリ文字列がサーバーに送信されていることがわかります
filter%5Blogic%5D=and&filter%5Bfilters%5D%5B0%5D%5Bvalue%5D=CAR&filter%5Bfilters%5D%5B0%5D%5Bfield%5D=text&filter%5Bfilters%5D%5B0%5D%5Boperator%5D=startswith&filter%5Bfilters%5D%5B0%5D%5BignoreCase%5D=true
解析すると、次のようになります
filter[logic]:and
filter[filters][0][value]:CAR
filter[filters][0][field]:text
filter[filters][0][operator]:startswith
filter[filters][0][ignoreCase]:true
見た目から、ComboBox はフィルターという名前の JavaScript 配列を ajax 経由でサーバーに送信しています。コントローラーでそのような配列を処理するにはどうすればよいですか?
public ActionResult Index(THE_TYPE_TO_USE filter) {
}
何を入れればいいTHE_TYPE_TO_USE
ですか?試してみましobject
たdynamic
が、どちらもヌル フィルターを生成しました。クライアントから送信されるフィルターは、次のように複雑になる可能性があることに注意してください。
$('#Solicitor').kendoComboBox({
placeholder: "@T("Enter the partial Name or Primary ID of the Entity.").Text",
dataTextField: "text",
dataValueField: "id",
autoBind: false,
minLength: 3,
filter: "startswith",
dataSource: {
serverFiltering: true,
// Additional filters which span several levels deep
filter: {
filters: [
{
filter: {
logic: "or",
filters: [
{ field: "content-type", operator: "eq", value: "Company" },
{ field: "content-type", operator: "eq", value: "Firm" }
]
}
}
]
},
transport: {
read: {
url: "@Url.Action("Index", "EntitiesAdmin", new { area = "BizNet.Entity"})",
dataType: "json"
}
}
}
});
これにより、次の解析済みクエリ文字列が生成されます
filter[filters][0][filter][logic]:or
filter[filters][0][filter][filters][0][field]:content-type
filter[filters][0][filter][filters][0][operator]:eq
filter[filters][0][filter][filters][0][value]:Company
filter[filters][0][filter][filters][1][field]:content-type
filter[filters][0][filter][filters][1][operator]:eq
filter[filters][0][filter][filters][1][value]:Firm
filter[logic]:and
filter[filters][1][value]:CAR
filter[filters][1][field]:text
filter[filters][1][operator]:startswith
filter[filters][1][ignoreCase]:true
ご覧のとおり、配列は数レベルの深さにすることができます。だから私の質問は、THE_TYPE_TO_USE
任意の深さの複雑なフィルターを処理できる上に何を入れるべきですか? これは、ASP.NET MVC ラッパーでのみ実行できますか? もしそうなら、どのように?