【问题标题】:How to use User.Identity.Name as a parameter for SqlDataSource in ASP.NET?如何在 ASP.NET 中使用 User.Identity.Name 作为 SqlDataSource 的参数?
【发布时间】:2011-04-21 07:09:58
【问题描述】:

对于 SqlDataSource,我可以为传入参数配置外部源。 例如,它可能是 QueryString、Session、Profile 等。 但是我没有选择使用 User 作为来源。

我知道我可以为 Inserting、Selecting、Updating、Deleting 事件中的参数提供值。但我不认为这是一个优雅的解决方案,因为我已经在 aspx 文件中定义了一些参数。我不想在两个不同的地方定义参数。搞得一团糟。

那么我可以在 .aspx 文件中以某种方式定义这个参数吗?

    <SelectParameters>
        <asp:QueryStringParameter DefaultValue="-1" Name="ID" 
            QueryStringField="ID" />
        //User.Identity.Name goes here as a value for another parameter  
    </SelectParameters> 

【问题讨论】:

    标签: c# asp.net parameter-passing sqldatasource


    【解决方案1】:

    在您的.aspx 中声明并填写您的代码隐藏:

    aspx

    <asp:Parameter Name="username" Type="String" DefaultValue="Anonymous" />
    

    代码隐藏

    protected void Page_Init(object sender, EventArgs e) {
        DataSource.SelectParameters["username"].DefaultValue = User.Identity.Name;
    }
    

    【讨论】:

    • 谢谢 Jan,但这是我想避免的。在您的示例中,我需要在代码隐藏中填充参数值。所以我必须在两个不同的地方处理参数:在 aspx 文件中和在 cs 文件中。我不能在aspx中声明参数并在aspx中为其绑定值吗?
    • 你可以试试&lt;asp:Parameter Name="username" Type="String" DefaultValue="&lt;%#User.Identity.Name%&gt;" /&gt;
    • 不幸的是,这不起作用,因为 Parameter 不支持 DataBinding...
    • 感谢 Jan,代码隐藏成功。无需在 .aspx 文件中声明默认值。只能添加到 codefehind 文件中。 protected void Page_Init(object sender, EventArgs e) { SqlDataSource1.InsertParameters["UserName"].DefaultValue = User.Identity.Name; }
    • 仅供参考。如果您有 asp:Button 的 postBack 到执行数据库操作或以任何方式使用数据源的函数...您也需要在该按钮回调的顶部有相同的代码。 (又名在数据绑定或 pre-databind() 之前)这就是我讨厌 aspx 表单的原因。荒谬,乏味,过分,无证,令人沮丧地难以弄清楚和处理,并且完全智障。我的建议:尽快改用剃须刀。
    【解决方案2】:

    在 asp 页面中放置一个带有连接字符串的空白数据源

    例如

    <asp:SqlDataSource ID="SqlDataSourceDeviceID" runat="server" ConnectionString="<%$ ConnectionStrings:myConnectionString %>">
    <asp:DropDownList ID="DropDownListDeviceID" runat="server" DataSourceID="SqlDataSourceDeviceID" DataTextField="DevLoc" DataValueField="DeviceId"></asp:DropDownList>
    

    在页面加载后的代码中

      protected void Page_Load(object sender, EventArgs e)
        {
    if (!IsPostBack) {
       String myQuery =String.Format("SELECT DeviceID,DevLoc  FROM  ... where UserName='{0}')",User.Identity.Name);
       SqlDataSourceDeviceID.SelectCommand = myQuery;
       SqlDataSourceDeviceID.DataBind();
       DropDownListDeviceID.DataBind();
    }
    

    【讨论】:

      【解决方案3】:

      您也可以通过在页面上创建一个隐藏的文本框,将 User.Identity.Name 应用于该值,然后在 SQL 数据源中使用 formcontrol 参数来完成此操作。这里的好处是可以复用select、insert、delete、update参数中的代码,不需要额外的代码。

      所以在aspx中我们有(noneDisplay是一个隐藏它的css类):

      <asp:TextBox runat="server" ID="txtWebAuthUser" CssClass="noneDisplay"></asp:TextBox>
      

      并在 sql 数据源更新部分的 Update 参数中:

      <asp:ControlParameter Name="CUrrentUser"  ControlID="txtWebAuthUser" Type="String" PropertyName="Text" />
      

      在更新中得到如下解释:

      UpdateCommand="UPDATE [Checks] SET [ScholarshipName] = @ScholarshipName, [Amount] = @Amount,LastModifiedBy=@CUrrentUser,
               [LastModified] = getdate() WHERE [CheckId] = @CheckId"
      

      然后在 .cs 文件表单中加载我们:

      this.txtWebAuthUser.Text = User.Identity.Name; 
      

      这项技术在我们所有应用程序的许多地方都运行良好。

      【讨论】:

      • 这不会留下一个巨大的安全漏洞,您可以通过更改隐藏文本框中的变量来冒充其他用户吗?
      • 在页面加载时设置它,这样用户的任何更改都不会被看到。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多