2010-10-05 8 views
10

Dla SqlDataSource mogę skonfigurować źródło zewnętrzne dla nadchodzącego parametru. Na przykład może to być QueryString, Session, Profile i tak dalej. Jednak nie mam opcji używania użytkownika jako źródła.Jak używać User.Identity.Name jako parametru dla SqlDataSource w ASP.NET?

Wiem, że mogłem podać wartość parametru we wstawianiu, wybieraniu, aktualizowaniu, usuwaniu zdarzeń. Ale nie sądzę, że jest to rozwikłane rozwiązanie, ponieważ mam pewne parametry już zdefiniowane w pliku aspx. Nie chcę mieć parametrów zdefiniowanych w dwóch osobnych miejscach. Robi bałagan.

Czy mogę w jakiś sposób zdefiniować ten parametr w pliku .aspx?

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

Odpowiedz

13

uznaniu jej w .aspx i wypełnić go w kodzie:

aspx

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

związanym kodzie

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

powinna być ".DefaultValue" zamiast ".Value" w kodzie C# – lincolnk

+0

Dziękuję Jan, ale tego właśnie chciałbym uniknąć. W twoim przykładzie muszę podać wartość parametru w codebehind. Tak więc muszę obsługiwać parametry w dwóch osobnych miejscach: w pliku aspx iw pliku cs. Czy nie mogę zadeklarować parametru w aspxie i powiązać go z wartością w aspxie? – Wodzu

+0

Możesz dać mu szansę używając '' –

1

w asp strona put puste źródło danych z łączem łańcuchowym

np.

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

w kodzie tyłu na 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

można również osiągnąć poprzez stworzenie ukryte pole tekstowe na stronie, należy zastosować User.Identity.Name wartości, a następnie użyj parametru formcontrol w źródło danych SQL. Zaletą jest to, że można ponownie użyć kodu w wybranych, wstawić, usunąć i zaktualizować parametry bez dodatkowego kodu.

Więc w aspx mamy (noneDisplay jest klasa css to ukryć):

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

aw parametrze Aktualizacja sekcji SQL aktualizacji źródła danych:

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

który dostaje interpretować aktualizacja taka jak ta:

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

, a następnie w ładowaniu plików .cs mamy:

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

Ta technika działa dobrze w wielu miejscach we wszystkich naszych aplikacjach.

+0

Czy nie pozostawia to dziury w bezpieczeństwie, w której można podszyć się pod innych użytkowników, zmieniając zmienną w ukrytym polu tekstowym? –

+0

Ustaw go podczas ładowania strony, więc żadna zmiana użytkownika nie będzie widoczna. –

Powiązane problemy