2013-04-13 19 views
1

我有一个SqlDataSource定义在我用来调用StoredProcedure的aspx文件中。它需要一个hiddenField作为其控制参数。是否可以从asp.net web窗体中的ViewState获取SqlDataSource参数?

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

回答

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。 我不觉得ViewStateParameter的代码是第一类的。也许你会想用更多的属性和/或带有断言的额外参数检查来修饰它。

2

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

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

相关问题