2010-10-05 119 views
10

对于SqlDataSource,我可以配置传入参数的外部源。 例如,它可能是一个QueryString,Session,Profile等等。 但是我没有选择使用用户作为来源。如何使用User.Identity.Name作为ASP.NET中SqlDataSource的参数?

我知道我可以在插入,选择,更新,删除事件中为参数提供值。但我不认为这是一个优雅的解决方案,因为我已经在aspx文件中定义了一些参数。我不想在两个不同的地方定义参数。它使混乱。

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

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

回答

13

声明它在你的.aspx并填写您的代码隐藏:在asp网页放

ASPX

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

代码隐藏

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

应该是'.DefaultValue'而不是'.Value'在C#代码 – lincolnk 2010-10-05 13:50:51

+0

谢谢Jan,但这是我想避免的。在你的例子中,我需要填充代码隐藏参数的值。所以我必须在两个独立的地方处理参数:在aspx文件和cs文件中。我不能在aspx中声明参数,并在aspx中为它绑定值吗? – Wodzu 2010-10-06 06:30:35

+0

您可以通过使用'”/>' – 2010-10-06 06:51:00

1

具有连接字符串的空白数据源

例如,

<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(); 
} 
1

您还可以通过创建页面上的文本框隐藏做到这一点,User.Identity.Name应用到值,然后使用在formcontrol参数SQL数据源。这样做的好处是您可以在选择,插入,删除和更新参数时重新使用代码而无需额外的代码。

所以在ASPX我们(noneDisplay是一个CSS类来隐藏它):

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

,并在SQL数据源更新部分的更新参数:

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

它获取的解释更新如下:

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

然后以.cs文件格式加载我们有:

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

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

+0

这是否不会留下一个空洞的安全漏洞,您可以通过更改隐藏文本框中的变量来模拟其他用户? – 2017-09-21 07:56:44

+0

在页面加载时进行设置,因此用户的任何更改都不会被看到。 – 2017-09-21 18:24:12

相关问题