1

我在我的 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 文件中。

4

2 回答 2

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>

并且您的参数将通过 key 从 viewstate 中获取其值input。我不觉得代码ViewStateParameter是一流的。也许你会想要用更多的属性和/或额外的带有断言的参数检查来装饰它。

于 2013-04-19T14:16:24.807 回答
2

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

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

于 2013-04-15T15:55:27.670 回答