2010-10-05 12 views
10

Per SqlDataSource è possibile configurare la sorgente esterna per il parametro in ingresso. Ad esempio potrebbe essere un oggetto QueryString, Session, Profile e così via. Tuttavia non ho un'opzione per utilizzare Utente come fonte.Come utilizzare User.Identity.Name come parametro per SqlDataSource in ASP.NET?

So che potrei fornire il valore per il parametro in Inserimento, Selezione, Aggiornamento, Eliminazione di eventi. Ma non penso che questa sia una soluzione ellegante perché ho alcuni parametri già definiti nel file aspx. Non voglio avere parametri definiti in due posti separati. Fa casino.

Quindi posso in qualche modo definire questo parametro nel file .aspx?

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

risposta

13

Dichiarare nel vostro .aspx e riempirlo in codebehind:

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

dovrebbe essere '.DefaultValue' invece di' .Value' nel codice C# – lincolnk

+0

Grazie Jan, ma questo è quello che vorrei evitare. Nel tuo esempio ho bisogno di riempire il valore del parametro in codebehind. Quindi devo gestire i parametri in due punti separati: nel file aspx e nel file cs. Non posso dichiarare il parametro in aspx e bind value anche in aspx? – Wodzu

+0

Puoi dare un colpo usando '' –

1

nella pagina ASP put un datasource vuoto con una stringa di connessione

ad es.

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

in codice dietro il 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

È inoltre possibile ottenere questo risultato con la creazione di una casella di testo nascosto nella pagina, applicare l'User.Identity.Name al valore e quindi utilizzare il parametro FormControl in l'origine dati SQL. Il vantaggio qui è che è possibile riutilizzare il codice nei parametri di selezione, inserimento, eliminazione e aggiornamento senza codice aggiuntivo.

Quindi, in aspx abbiamo (noneDisplay è una classe CSS per nasconderlo):

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

e nel parametro di aggiornamento della sezione sql aggiornamento origine dati:

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

che viene interpretato in l'aggiornamento qualcosa del genere:

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

e quindi nel caricamento del file .cs abbiamo:

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

Questa tecnica ha funzionato bene in molti posti in tutte le nostre applicazioni.

+0

Questo non lascia un vuoto buco di sicurezza, in cui è possibile impersonare altri utenti modificando la variabile nella casella di testo nascosta? –

+0

Impostalo sul caricamento della pagina, quindi non verrà visualizzato alcun cambiamento da parte dell'utente. –

Problemi correlati