Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Kendo DataSourceRequest转换回查询字符串_C#_Asp.net Mvc_Kendo Ui_Kendo Asp.net Mvc - Fatal编程技术网

C# 将Kendo DataSourceRequest转换回查询字符串

C# 将Kendo DataSourceRequest转换回查询字符串,c#,asp.net-mvc,kendo-ui,kendo-asp.net-mvc,C#,Asp.net Mvc,Kendo Ui,Kendo Asp.net Mvc,剑道MVC库中是否有内置的助手,可以从MVC6控制器中将剑道网格的DataSourceRequest对象转换回querystring?有点像“模型解锁器” 如果DataSourceRequest是一个简单的对象,那么您可以更轻松地使用它,但由于它具有更复杂的结构,我希望已经有了“剑道方式”。我还可以从Request.querystring.Value中获取整个querystring,但我希望在参数较多的情况下,可以轻松地仅隔离数据源部分 大概是这样的: public int GetStuff([

剑道MVC库中是否有内置的助手,可以从MVC6控制器中将剑道网格的
DataSourceRequest
对象转换回querystring?有点像“模型解锁器”

如果DataSourceRequest是一个简单的对象,那么您可以更轻松地使用它,但由于它具有更复杂的结构,我希望已经有了“剑道方式”。我还可以从
Request.querystring.Value
中获取整个querystring,但我希望在参数较多的情况下,可以轻松地仅隔离数据源部分

大概是这样的:

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 ;
}
看看我在Telerik论坛上发布的“”

有三个部分越来越深

阅读器

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

过滤器TopParameterizedQuery

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;
}
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;
}
私有字符串筛选器TopParameterizedQuery(IList筛选器,FilterCompositionLogicalOperator compositionOperator=FilterCompositionLogicalOperator.And,SqlCommand=null)
{
//看https://www.telerik.com/forums/how-to-access-datasourcerequest-filters-in-controller-
如果(!filters.Any())返回“”;
字符串结果=“(”;
字符串组合为“”;
foreach(过滤器中的var过滤器)
{
if(过滤器为过滤器描述器fd)
{
结果+=
与+“(”组合
+描述符SQLServerQuery(fd,命令)
+ ")"
;
}
else if(过滤器为复合过滤器描述符cfd)
{
结果+=
与+“(”组合
+FilterStopParameterizedQuery(cfd.FilterDescriptors,cfd.LogicalOperator,命令)
+ ")"
;
}
结合=
(compositionOperator==FilterCompositionLogicalOperator.And)
“和”
:“或”
;
}
结果+=”;
返回结果;
}
最后

描述符SQLServerQuery

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;
}
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;
}
私有字符串描述符SQLServerQuery(FilterDescriptor fd,SqlCommand)
{
字符串parameterName=“@PARAMETER”+command.Parameters.Count;
字符串结果;
//某些字符串筛选器值被修改为在类似SQL的子句中用作参数,因此可以使用副本。
//当以后使用ToDataSourceResult(请求)时,原始值必须保持不变。
对象filterValue=fd.Value;
开关(fd.操作员)
{
case FilterOperator.IsLessThan:result=“[”+fd.Member+”]“+”<”+parameterName;break;
case FilterOperator.IsLessThanOrEqualTo:result=“[”+fd.Member+“]”“+”=“+parameterName;break;
case FilterOperator.IsGreaterThan:result=“[”+fd.Member+”]”“+”>“+参数名;break;
案例过滤器Operator.StartsWith:
filterValue=fd.Value.ToString().ToSqlSafeLikeData()+“%”;
result=“[”+fd.Member+”]“+”like“+parameterName;break;
案例过滤器Operator.EndsWith:
filterValue=“%”+fd.Value.ToString().ToSqlSafeLikeData();
result=“[”+fd.Member+”]“+”like“+parameterName;break;
案例过滤器操作器。包含:
filterValue=“%”+fd.Value.ToString().ToSqlSafeLikeData()+“%”;
result=“[”+fd.Member+”]“+”like“+parameterName;break;
案例过滤器Operator.IsContainedIn:
抛出新异常(“没有[”+fd.Member+“]”“+”+fd.Operator+”+fd.Value的转换器);
案例过滤器Operator.DoesNotContain:
filterValue=“%”+fd.Value.ToString().ToSqlSafeLikeData();
result=“[”+fd.Member+”]“+”与“+parameterName;break;
case FilterOperator.IsNull:result=“[”+fd.Member+“]”“+”为NULL”中断;
case FilterOperator.IsNotNull:result=“[”+fd.Member+“]”“+”不为NULL”;break;
case FilterOperator.IsEmpty:result=“[”+fd.Member+“]””+“=”;中断;
case FilterOperator.IsNotEmpty:result=“[”+fd.Member+”]“+””中断;
违约:
抛出新异常(“没有[”+fd.Member+“]”“+”+fd.Operator+”+fd.Value的转换器);
}
Add(新的SqlParameter(parameterName,filterValue));
返回结果;
}

你有没有找到解决办法?@dalekd我没有。我也从Telerik网格转移到了,因为它做了我需要的一切。