2009-12-18 6 views
2

현재 LinqDataSource에 대한 WHERE 절을 만들 필요가 있으며 현재 로그인 한 사용자에 따라 다릅니다. 물론, 코드 숨김에 현재 로그인 한 사용자에게 액세스 권한이 있으며 특히 데이터베이스에서 그/그녀에게 속한 데이터 만 가져 오기 위해 사용자 ID가 필요합니다.ASP.NET LinqDataSource WHERE 절

전에, 나는 <asp:LinqDataSource /> 태그에 Where 속성을 추가하지만, 서버 컨트롤 그들에 <% %> 태그가 없기 때문에, 내가 OnLoad에서 코드 숨김에서 Where 속성을 설정하려고 할 때 그것을 잘 작동 데이터 바인딩의 GridView를 내 데이터 소스에 연결되어 있습니다.

그러나 코드 숨김에 속성을 설정하면 아무 효과가없는 것 같습니다. 그것은 코드 백에서가 아니라 ascx 코드에서 수동으로 (그리고 정적으로) 지정할 때 잘 동작합니다.

내가 잘못된 순서로 또는 잘못된 시간에 일을하고 있다고 생각합니다. 어떻게해야합니까?

는 UPDATE :

이 해킹 함께했다. 나는 가짜 라벨 lblViewedUserIDVisible="false"을 사용하여 사용자 ID를 추출 할 수있는 컨트롤을 얻습니다. 데이터 바인딩 전에 코드 숨김에서이 ​​레이블의 텍스트를 설정합니다.

<asp:ControlParameter />과 함께 <WhereParameters>을 추가했습니다.

<asp:LinqDataSource ID="dsLinqSource" AutoPage="true" AutoSort="true" 
    ContextTypeName="Ortrac.Common.Dbml.OrComDataContext" 
    EnableDelete="false" TableName="myTableName" EnableInsert="false" 
    EnableUpdate="false" runat="server" Select="new(Edited, Activity)" 
    Where="TheUserID.ToString().Equals(@ViewedUserID)"><%-- HACK! --%> 
    <WhereParameters> 
    <asp:ControlParameter Name="ViewedUserID" ControlID="lblViewedUserID" 
          Type="String" PropertyName="Text" /> 
    </WhereParameters> 
</asp:LinqDataSource> 

<%-- Dummy label --%> 
<asp:Label runat="server" ID="lblViewedUserID" Visible="false" /> 

이것은 ASP.NET 프로그래밍 방식입니다.

+0

귀하의 접근 방식은 나에게 많은 시간을 저장 등 CurrentLanguageIdParameter, CurrentInstanceIdParameter을 가지고, 감사합니다! –

답변

1

게시 한 코드는 실제로는 완전히 받아 들일 수있는 방법입니다. 이 작업을 자주 수행해야하는 경우 Parameter 클래스에서 상속하여 사용자 정의 매개 변수를 만들 수 있습니다. 이것은 우리가 사용하는 것입니다 :

public class CurrentUserIdParameter : System.Web.UI.WebControls.Parameter 
{ 

    protected override int Evaluate(System.Web.HttpContext context, System.Web.UI.Control control) 
    { 
     if (Contact.Current == null) { 
      return -1; 
     } 
     else { 
      return Contact.Current.ContactID; 
     } 
    } 
} 

이 여러 상황에서 잘 작동 - 우리는 또한