2010-10-05 13 views
10

Para SqlDataSource puedo configurar la fuente externa para el parámetro entrante. Por ejemplo, podría ser una QueryString, Session, Profile, etc. Sin embargo, no tengo la opción de usar el usuario como fuente.¿Cómo se usa User.Identity.Name como parámetro para SqlDataSource en ASP.NET?

Sé que podría proporcionar valor para el parámetro en Inserción, Selección, Actualización, Eliminación de eventos. Pero no creo que esta sea una solución elegante porque ya tengo algunos parámetros definidos en el archivo aspx. No quiero tener parámetros definidos en dos lugares separados. Hace lío.

Entonces, ¿puedo de alguna manera definir este parámetro en el archivo .aspx?

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

Respuesta

13

Declárelo en su .aspx y llenarlo en su código subyacente:

aspx

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

CodeBehind

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

debería ser '.DefaultValue' en lugar de' .Value' en el código C# – lincolnk

+0

Gracias Jan, pero esto es lo que me gustaría evitar. En tu ejemplo, necesito completar el valor del parámetro en codebehind. Así que tengo que manejar los parámetros en dos lugares separados: en el archivo aspx y en el archivo cs. ¿No puedo declarar el parámetro en aspx y también vincular el valor en aspx? – Wodzu

+0

Puede probarlo usando '' –

1

en la página asp puesto un origen de datos en blanco con una conexión de

p.

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

en código detrás de pageload

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

También puede lograr esto mediante la creación de un cuadro de texto oculto en la página, aplicar el User.Identity.Name al valor y luego utilizar el parámetro en FormControl la fuente de datos SQL. La ventaja aquí es que puede reutilizar el código en los parámetros de selección, inserción, eliminación y actualización sin código adicional.

Así que en aspx hemos (noneDisplay es una clase css para ocultarlo):

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

y en el parámetro de actualización de la sección de actualización de fuente de datos SQL:

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

que consigue interpretar de la actualización algo como esto:

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

y luego en la .Carpe de archivos de la forma carga tenemos:

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

Esta técnica ha funcionado bien en muchos lugares en todas nuestras aplicaciones.

+0

¿Esto no deja un agujero de seguridad enorme, donde puede suplantar a otros usuarios cambiando la variable en el cuadro de texto oculto? –

+0

Establezca la carga de la página, por lo que no se verá ningún cambio por parte del usuario. –

Cuestiones relacionadas