Kendo MVC库中是否有内置帮助器可以将Kendo Grid的DataSourceRequest
对象转换回MVC6控制器内的查询字符串?有点像“模型解开”吗?
如果DataSourceRequest是一个简单的对象,这将更容易推出自己的,但由于它有一个更复杂的结构,我希望已经有一个“剑道方式”。我也可以从Request.QueryString.Value
中获取整个查询字符串,但希望我能够轻松地将数据源部分隔离出来,以备有更多参数的情况。
这样的事情:
public int GetStuff([DataSourceRequest]DataSourceRequest request)
{
var res = 0;
try
{
//something like these which do not really exist?
var kendoQS1 = request.ToQueryString();
var kendoQS2 = KendoDataSourceQueryStringBuilder.FromDataSource(request);
//do stuff with kendoQS
}
catch (Exception ex)
{
//...
}
return res ;
}
答案 0 :(得分:0)
看看我在Telerik论坛上发布的“ Converting DataSourceRequest filters to SqlServer parameterized query in controller Read method”。
这三个部分越来越深。
阅读器
public ActionResult MyData_Read(DataSourceRequest request)
{
SqlCommand command = new SqlCommand();
string whereClause = FiltersToParameterizedQuery(request.Filters, command: command);
...
... compute order clause
... compute paging clause
string pageQuery = "select * from MY_UNMODELED_DATABASE_OBJECT" + " " + whereClause + orderClause + pageClause;
string countQuery = "select count(1) from MY_UNMODELED_DATABASE_OBJECT" + " " + whereClause;
...
FiltersToParameterizedQuery
private string FiltersToParameterizedQuery(IList<IFilterDescriptor> filters, FilterCompositionLogicalOperator compositionOperator = FilterCompositionLogicalOperator.And, SqlCommand command = null)
{
// See https://www.telerik.com/forums/how-to-access-datasourcerequest-filters-in-controller-
if (!filters.Any()) return "";
string result = "(";
string combineWith = "";
foreach (var filter in filters)
{
if (filter is FilterDescriptor fd)
{
result +=
combineWith + "("
+ DescriptorToSqlServerQuery(fd, command)
+ ")"
;
}
else if (filter is CompositeFilterDescriptor cfd)
{
result +=
combineWith + "("
+ FiltersToParameterizedQuery(cfd.FilterDescriptors, cfd.LogicalOperator, command)
+ ")"
;
}
combineWith =
(compositionOperator == FilterCompositionLogicalOperator.And)
? " and "
: " or "
;
}
result += ")";
return result;
}
最后
DescriptorToSqlServerQuery
private string DescriptorToSqlServerQuery (FilterDescriptor fd, SqlCommand command)
{
string parameterName = "@PARAMETER" + command.Parameters.Count;
string result;
// Some string filter values are modified for use as parameters in a SQL LIKE clause, thus work with a copy.
// The original value must remain unchanged for when ToDataSourceResult(request) is used later.
Object filterValue = fd.Value;
switch (fd.Operator)
{
case FilterOperator.IsLessThan: result = "[" + fd.Member + "]" + " < " + parameterName; break;
case FilterOperator.IsLessThanOrEqualTo: result = "[" + fd.Member + "]" + " <= " + parameterName; break;
case FilterOperator.IsEqualTo: result = "[" + fd.Member + "]" + " = " + parameterName; break;
case FilterOperator.IsNotEqualTo: result = "[" + fd.Member + "]" + " <> " + parameterName; break;
case FilterOperator.IsGreaterThanOrEqualTo: result = "[" + fd.Member + "]" + " >= " + parameterName; break;
case FilterOperator.IsGreaterThan: result = "[" + fd.Member + "]" + " > " + parameterName; break;
case FilterOperator.StartsWith:
filterValue = fd.Value.ToString().ToSqlSafeLikeData() + "%";
result = "[" + fd.Member + "]" + " like " + parameterName; break;
case FilterOperator.EndsWith:
filterValue = "%" + fd.Value.ToString().ToSqlSafeLikeData();
result = "[" + fd.Member + "]" + " like " + parameterName; break;
case FilterOperator.Contains:
filterValue = "%" + fd.Value.ToString().ToSqlSafeLikeData() + "%";
result= "[" + fd.Member + "]" + " like " + parameterName; break;
case FilterOperator.IsContainedIn:
throw new Exception("There is no translator for [" + fd.Member + "]" + " " + fd.Operator + " " + fd.Value);
case FilterOperator.DoesNotContain:
filterValue = "%" + fd.Value.ToString().ToSqlSafeLikeData();
result = "[" + fd.Member + "]" + " not like " + parameterName; break;
case FilterOperator.IsNull: result = "[" + fd.Member + "]" + " IS NULL"; break;
case FilterOperator.IsNotNull: result = "[" + fd.Member + "]" + " IS NOT NULL"; break;
case FilterOperator.IsEmpty: result = "[" + fd.Member + "]" + " = ''"; break;
case FilterOperator.IsNotEmpty: result = "[" + fd.Member + "]" + " <> ''"; break;
default:
throw new Exception("There is no translator for [" + fd.Member + "]" + " " + fd.Operator + " " + fd.Value);
}
command.Parameters.Add(new SqlParameter(parameterName, filterValue));
return result;
}