是否可以从asp.net Web表单中的ViewState获取SqlDataSource参数?

时间:2013-04-13 00:02:54

标签: webforms viewstate sqldatasource hidden-field

我在我的aspx文件中定义了一个SqlDataSource,用于调用StoredProcedure。它需要一个hiddenField作为其控制参数。

<asp:HiddenField ID="input" runat="server" />

<asp:SqlDataSource ID="source" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
    SelectCommand="sp" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <asp:ControlParameter ControlID="input" Name="input" Type="String" />
    </SelectParameters>
</asp:SqlDataSource>

有没有办法可以从ViewState中获取该参数?最好将数据源定义保存在aspx文件中。

2 个答案:

答案 0 :(得分:3)

您的案例中的解决方案非常简单。只需创建自己的类,就可以从Parameter继承它并覆盖Evaluate方法。

[DefaultProperty("ViewStateKey")]
public class ViewStateParameter : Parameter
{
    public string ViewStateKey
    {
        get
        {
            return (string)ViewState["ViewStateKey"] ?? string.Empty;
        }
        set
        {
            if (ViewStateKey == value)
                return;
            ViewState["ViewStateKey"] = value;

            OnParameterChanged();
        }
    }

    protected override object Evaluate(HttpContext context, Control control)
    {
        if (control == null || string.IsNullOrEmpty(ViewStateKey))
            return null;

        return ViewState[ViewStateKey];
    }
}

之后,您将能够使用您的参数,如下所示(只需记住在页面顶部或web.config中注册):

<asp:SqlDataSource ID="source" runat="server" 
    ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
    SelectCommand="sp" SelectCommandType="StoredProcedure">
    <SelectParameters>
        <my:ViewStateParameter Name="input" Type="String" ViewStateKey="input" />
    </SelectParameters>
</asp:SqlDataSource>

您的参数将通过键input从viewstate获取其值。 我不认为ViewStateParameter的代码属于第一类。也许你会想要用更多属性和/或带断言的额外参数检查来装饰它。

答案 1 :(得分:2)

我有类似的问题。出于安全原因,我不想使用隐藏字段来绑定数据源参数。

我用google搜索了一个 - 使用asp:label而不是隐藏字段(确保Visible = false)。然后你的标签进入查看状态,你可以将标签绑定到数据源参数。