我在我的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文件中。
答案 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)。然后你的标签进入查看状态,你可以将标签绑定到数据源参数。