2012-03-11 19 views
2

以下のコードはコンパイル時にエラーが発生しませんが、ページを開くとオブジェクト参照がオブジェクトのインスタンスに設定されていないことを示すGuid currentUserId = (Guid)currentUser.ProviderUserKey;にエラーが発生します。オブジェクト参照がオブジェクトのインスタンスに設定されていません。

foreach(DataRowView ProfileInfo in UserProfileDataSource.Select(DataSourceSelectArguments.Empty)) 
      { 
       //Some codes where I display data from database 
      } 



protected void UserProfileDataSource_Selecting(object sender, SqlDataSourceSelectingEventArgs e) 
    { 
     MembershipUser currentUser = Membership.GetUser(); 

     Guid currentUserId = (Guid)currentUser.ProviderUserKey; 

     e.Command.Parameters["USERID"].Value = currentUserId; 
    } 

とここで私のSqlDataSourceコントロールである

<asp:SqlDataSource ID="UserProfileDataSource" runat="server" 
      ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
      onselecting="UserProfileDataSource_Selecting" 
      ProviderName="<%$ ConnectionStrings:ConnectionString.ProviderName %>" 


      SelectCommand="SELECT &quot;TITLE&quot;, &quot;FAMILYNAME&quot;, &quot;GIVENNAME&quot;, &quot;MIDDLENAME&quot;, &quot;POSITION&quot;, &quot;INSTITUTIONNAME&quot;, &quot;USERID&quot;, &quot;REGISTEREDDATE&quot; FROM &quot;MEMBERINFO&quot; WHERE (&quot;USERID&quot; = ?)"> 
      <SelectParameters> 
       <asp:Parameter Name="USERID" Type="Object" /> 
      </SelectParameters> 
     </asp:SqlDataSource> 

アーニー

+0

 if (Membership.GetUser() == null) { Label1.Text = ""; Label_TotalCoxxxxxxxxx.Text = ""; Label_TotalSuxxxxxxxxx.Text =""; } else { string loggedinuser = Membership.GetUser().ToString(); Label1.Text = loggedinuser; Label_TotalCoxxxxxxxxx.Text = "Total of xxxxxxxxxx Added in the current Month:-"; Label_TotalSuxxxxxxxxx.Text = "Total of yyyyyyyyyy done in the current Month:-"; } } 
があるCurrentUserヌルはありますか? Request.IsAuthenticatedがtrueであることを確認しましたか? – kmp

+0

ご返信ありがとうございます。私は、ログイン後にプロフィールを訪問するたびにコードが実行されるというシナリオがあるため、nullではないと思います。私はRequest.IsAuthenticatedをチェックしていません。その例を教えてください。 –

+0

これは本当にcurrentUserが私にはnullであるようです(下の質問の答えであなたが変更したものを見てみると、そうであることが示されるでしょう)。 Guid currentUser = ...という行にブレークポイントを設定し、ウォッチウィンドウでSystem.Threading.Thread.CurrentPrincipal.Identity.Nameをチェックし、それがログインしているユーザーのユーザー名であることを確認してください。 – kmp

答えて

4

あなたはCurrentUserにはそれにアクセスしようとする前に、nullでないことを確認するためにチェックする必要があります:

if (currentUser != null) 
{ 
/* do stuff here */ 
} 
else 
{ 
/* do something else, like show an error message perhaps */ 
} 
+0

ツアー早送りありがとうございます。あなたが投稿したコードを使用しようとしましたが、私はこのようにします 'protected void UserProfileDataSource_Selecting(オブジェクト送信者、SqlDataSourceSelectingEventArgs e) { //現在ログオンしているユーザーへの参照を取得します MembershipUser currentUser = Membership.GetUser(); if(currentUser!= null) { Guid currentUserId =(Guid)currentUser.ProviderUserKey; e.Command.Parameters ["USERID"]。値=現在のユーザーID。 } } ' –

+0

あなたはあなたが好きだが、あなたはそれを使用しようとする前にそのヌルではないことを確認する必要があります。 :) –

+0

しかし、 'UserProfileDataSource.Select(DataSourceSelectArguments.Empty)'行で同じエラーが発生した –

0

はこれを試しますコード:

string username = HttpContext.Current.User.Identity.Name; 

if(!string.IsNullOrEmpty(username)) 
{ 
MembershipUser currentUser = Membership.GetUser(username); 
Guid currentUserId = new Guid(currentUser.ProviderUserKey.ToString()); 

} 
0

ログインしているユーザーが必要なページに匿名ユーザーがアクセスできるように見えます。ユーザーがまだログインしていない場合、そのユーザーを取得することはできません。

セキュリティは、認証と認証という2つの部分で構成されています。認証はログインしていますが、許可されていないユーザー(ログインしていないユーザー、または適切な役割が割り当てられていないユーザーなど)へのアクセスを許可していません。

ページが認証されたユーザーに依存する場合は、匿名ユーザーのアクセスを拒否する必要があります。ページが認証されたユーザーに依存せず、単に認証された場合にメンバー情報を使用するだけの場合、ユーザーが認証されていない場合、メンバー関数を呼び出す(またはメンバーデータを使用する)ことを防ぐ必要があります。

-1

問題は不正です。 次の手順を試してください: - ウェブサイトで、「スタートページ」を正しい「ログイン」ページに設定してください。 ログインして正しくページに移動したら、このプロパティにアクセスできるはずです。 [ログアウト]ボタンをクリックしてもリンク先ページがこのメンバーシップ情報を参照している可能性があります。

回避策は簡単です。 1.開始ページを正しく設定してください。 2.Handle the 2 cases: - ユーザーはログインしており、ユーザーは効率的にログインしていません。 例は以下の通りである: -

保護されたボイドをPage_Load(オブジェクト送信者、のEventArgs電子) {

関連する問題