【问题标题】:ASP.NET - Best practice for setting value of SqlDataSource Parameter from a QueryString value @ Page Load?ASP.NET - 从 QueryString 值@页面加载设置 SqlDataSource 参数值的最佳实践?
【发布时间】:2010-02-20 05:59:02
【问题描述】:

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

将 QueryString 值分配给 ASPX 页面上定义的 SqlDataSource 的参数是否存在公认的最佳实践?

我知道的选项:

  1. 不要在 ASPX 文件中包含参数。通过代码隐藏直接添加它们——并在添加时分配 Param.DefaultValue。
  2. 在页面加载中设置 Param.DefaultValue(代码块 2)

这两个都使用 DefaultValue,这是一个显然不打算以这种方式使用的属性。 ASP.NET 霸主们是否有推荐的方法来完成这项常见任务?

代码块 1

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

代码块 2:

 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    SD1.SelectParameters("StoreID").DefaultValue = Request.QueryString("StoreID")
 End Sub

【问题讨论】:

  • 我了解其他问题已经涵盖了实现此任务的各种方法。这个问题更符合 ASP.NET 团队打算如何执行此任务。谢谢

标签: c# .net asp.net vb.net


【解决方案1】:

最好直接使用 DataSource 事件而不是 PageLoad 事件来处理。

要在 Select 中设置 QueryString,请将其添加到您的数据源中:

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

这告诉 DataSource Select 在 QueryString 中查找“?StoreID=x”,并从 URL 中将 StoreID 设置为“x”,如您所提到的。

要为 StoreID 设置默认值,请像这样连接到 DataSource Selecting Event:

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

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

【讨论】:

  • 哇,不知道这是可能的。谢谢!
  • 没问题,我们经常遇到这个问题。如果您需要帮助,请告诉我。
【解决方案2】:

我以前有时使用对象数据源这样做,但我没有将默认值添加到 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;
    }

【讨论】:

  • 我猜想 SqlDataDource Selectparameters 会允许这样做,但他们没有。无法将字符串转换为参数。目前,我只是调整 DefaultValue 属性,但感觉不对。
  • 我现在检查了。选择事件触发时可以更改参数值,但我认为它直接访问 SqlCommand; e.Command.Parameters["@StoreId"].Value = QueryStringKeys.StoreId.Value;
  • 不幸的是,我在参数上没有 Value 属性,只有一个 defaultValue。幸运的是,Jamon 告诉我 QueryStringParameter 似乎是专门为此目的而设计的。
猜你喜欢
  • 2011-04-26
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2010-11-16
相关资源
最近更新 更多