2010-10-05 39 views
10

Đối với SqlDataSource tôi có thể cấu hình nguồn bên ngoài cho paramater đến. Ví dụ: đó có thể là QueryString, Phiên, Hồ sơ v.v. Tuy nhiên, tôi không có tùy chọn để sử dụng Người dùng làm nguồn.Làm thế nào để sử dụng User.Identity.Name như một tham số cho SqlDataSource trong ASP.NET?

Tôi biết rằng tôi có thể cung cấp giá trị cho tham số trong Chèn, Chọn, Cập nhật, Xóa sự kiện. Nhưng tôi không nghĩ rằng đây là một giải pháp ellegant vì tôi có một số tham số đã được definied trong tập tin aspx. Tôi không muốn có các thông số được xác định ở hai nơi riêng biệt. Nó làm cho lộn xộn.

Vì vậy, tôi có thể xác định bằng cách nào đó tham số này trong tệp .aspx?

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

Trả lời

13

Khai báo nó trong .aspx của bạn và điền nó trong codebehind của bạn:

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

phải là '.DefaultValue' thay vì' .Value' trong mã C# – lincolnk

+0

Cảm ơn Jan, nhưng đây là những gì tôi muốn tránh. Trong ví dụ yuour, tôi cần điền vào giá trị của tham số trong codebehind. Vì vậy, tôi phải xử lý các thông số ở hai nơi riêng biệt: trong tệp aspx và trong tệp cs. Tôi không thể khai báo các tham số trong aspx và ràng buộc giá trị cho nó trong aspx quá? – Wodzu

+0

Bạn có thể chụp ảnh bằng cách sử dụng '' –

1

trong asp trang đặt nguồn dữ liệu trống với chuỗi kết nối

ví dụ:

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

trong mã đằng sau trên 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

Bạn cũng có thể thực hiện điều này bằng cách tạo ra một textbox ẩn trên trang, áp dụng các User.Identity.Name với giá trị và sau đó sử dụng các tham số formcontrol trong nguồn dữ liệu SQL. Lợi thế ở đây là bạn có thể sử dụng lại mã trong các thông số chọn, chèn, xóa và cập nhật mà không cần thêm mã.

Vì vậy, trong aspx chúng tôi đã (noneDisplay là một lớp css để ẩn nó):

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

và trong tham số Cập nhật của phần sql nguồn dữ liệu cập nhật:

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

mà được giải thích theo cập nhật nội dung như sau:

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

và sau đó tải biểu mẫu tệp .cs chúng tôi có:

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

Kỹ thuật này đã hoạt động tốt ở nhiều nơi trong tất cả các ứng dụng của chúng tôi.

+0

Điều này không để lại lỗ hổng bảo mật, nơi bạn có thể mạo danh người dùng khác bằng cách thay đổi biến trong hộp văn bản ẩn? –

+0

Đặt nó trên tải trang, do đó, bất kỳ thay đổi nào của người dùng sẽ không được nhìn thấy. –

Các vấn đề liên quan