Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# ASP.NET-从页面加载时的QueryString值设置SqlDataSource参数值的最佳实践?_C#_.net_Asp.net_Vb.net - Fatal编程技术网

C# ASP.NET-从页面加载时的QueryString值设置SqlDataSource参数值的最佳实践?

C# ASP.NET-从页面加载时的QueryString值设置SqlDataSource参数值的最佳实践?,c#,.net,asp.net,vb.net,C#,.net,Asp.net,Vb.net,假设我们有一个值通过页面的URL传入。示例:www.test.com/page.aspx?&Key=Val。可以通过Request.Querystring(“Key”)检索Val 为ASPX页面上定义的SqlDataSource参数分配QueryString值是否有公认的最佳实践? 我知道的选项: 不要在ASPX文件中包含参数。直接通过codebehind添加它们——并在添加时分配Param.DefaultValue 在页面加载中设置Param.DefaultValue(代码块2) 这两种方法都

假设我们有一个值通过页面的URL传入。示例:www.test.com/page.aspx?&Key=Val。可以通过Request.Querystring(“Key”)检索Val

为ASPX页面上定义的SqlDataSource参数分配QueryString值是否有公认的最佳实践?

我知道的选项:

  • 不要在ASPX文件中包含参数。直接通过codebehind添加它们——并在添加时分配Param.DefaultValue
  • 在页面加载中设置Param.DefaultValue(代码块2)
  • 这两种方法都使用DefaultValue,这是一种显然不打算以这种方式使用的属性。ASP.NET的霸主们是否有一个推荐的方法来完成这个常见的任务?

    代码块1

        <SelectParameters>
            <asp:Parameter Name="StoreID" Type="String" DefaultValue="-1" />
        </SelectParameters>
    

    以前我用对象数据源做过,但我没有向Page_Load或ASPx添加默认值

    public class QueryStringKey<T>
    {
        public static implicit operator QueryStringKey<T>(string key)
        {
            return new QueryStringKey<T> { Key = key };
        }
    
        public string Key { get; set; }
    
        public T Value
        {
            get
            {
                if (HasValue == false)
                {
                    throw new ArgumentNullException(Key);
                }
    
                TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
                try
                {
                    return (T)converter.ConvertFromString(_valueString);
                }
                catch
                {
                    return (T)Activator.CreateInstance<T>();
                }
            }
        }
    
        public bool HasValue
        {
            get
            {
                return !String.IsNullOrEmpty(_valueString);
            }
        }
    
        private string _valueString
        {
            get
            {
                return HttpContext.Current.Request.QueryString[Key];
            }
        }
    }
    
    public class QueryStringKeys
    {
        public static QueryStringKey<int> StoreId = "StoreId";
    }
    
        protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
        {
            if (QueryStringKeys.StoredId.HasValue)
                e.InputParameters["StoreId"] = QueryStringKeys.StoreId.Value;
        }
    
    公共类QueryStringKey
    {
    公共静态隐式运算符QueryStringKey(字符串键)
    {
    返回新的QueryStringKey{Key=Key};
    }
    公共字符串密钥{get;set;}
    公共价值
    {
    得到
    {
    if(HasValue==false)
    {
    抛出新的ArgumentNullException(键);
    }
    TypeConverter converter=TypeDescriptor.GetConverter(typeof(T));
    尝试
    {
    return(T)converter.ConvertFromString(_valueString);
    }
    抓住
    {
    return(T)Activator.CreateInstance();
    }
    }
    }
    公共布尔值
    {
    得到
    {
    return!String.IsNullOrEmpty(\u valueString);
    }
    }
    私有字符串_valueString
    {
    得到
    {
    返回HttpContext.Current.Request.QueryString[Key];
    }
    }
    }
    公共类查询字符串键
    {
    公共静态QueryStringKey StoreId=“StoreId”;
    }
    受保护的无效ObjectDataSource1\u选择(对象发送方,ObjectDataSourceSelectingEventArgs e)
    {
    if(QueryStringKeys.StoredId.HasValue)
    e、 InputParameters[“StoreId”]=QueryStringKeys.StoreId.Value;
    }
    
    最好直接使用数据源事件,而不是PageLoad事件来处理

    要在Select中设置查询字符串,请将其添加到数据源:

        <SelectParameters>
            <asp:QueryStringParameter Name="StoreID" QueryStringField="StoreID" Type="Int64" />
        </SelectParameters>
    

    编辑:修改为使用变量名。

    我知道其他问题涵盖了实现此任务的各种方法。这个问题更接近于ASP.NET团队打算如何执行此任务。ThanksI会猜到SqlDataDource Selectparameters会允许这样做,但它们不允许。无法将字符串转换为参数。现在,我只是调整了DefaultValue属性,但感觉不对。我现在检查了它。参数值可以在选择EventFire时更改,但我认为它可以直接访问SqlCommand;e、 Command.Parameters[“@StoreId”].Value=QueryStringKeys.StoreId.Value;不幸的是,我没有参数的Value属性,只有defaultValue。幸运的是,Jamon告诉我QueryStringParameter似乎是专门为此设计的。哇,我不知道这是可能的。谢谢没问题,我们经常遇到这个问题。如果你需要帮助,请告诉我。
        <SelectParameters>
            <asp:QueryStringParameter Name="StoreID" QueryStringField="StoreID" Type="Int64" />
        </SelectParameters>
    
    Protected Sub SD1DataSource_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles SD1DataSource.Selecting
        If e.Command.Parameters("@StoreID").Value Is Nothing Then
            e.Command.Parameters("@StoreID").Value = 155
        End If
    End Sub