【问题标题】:Convert Kendo DataSourceRequest back into query string将 Kendo DataSourceRequest 转换回查询字符串
【发布时间】:2016-05-23 21:48:06
【问题描述】:

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

【问题讨论】:

  • 你找到解决办法了吗?
  • @DaleyKD 我没有。我也从 Telerik grid 搬到了mvc6-grid.azurewebsites.net,因为它可以满足我的一切需求。

标签: c# asp.net-mvc kendo-ui kendo-asp.net-mvc


【解决方案1】:

看看我在 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多