Asp.net 对象引用未设置为对象的实例。
我下面的代码在编译期间没有任何错误,但是当我打开页面时,Asp.net 对象引用未设置为对象的实例。,asp.net,asp.net-membership,guid,userid,Asp.net,Asp.net Membership,Guid,Userid,我下面的代码在编译期间没有任何错误,但是当我打开页面时,Guid currentUserId=(Guid)currentUser.ProviderUserKey出现错误说明对象引用未设置为对象的实例 foreach(DataRowView ProfileInfo in UserProfileDataSource.Select(DataSourceSelectArguments.Empty)) { //Some codes where I dis
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 "TITLE", "FAMILYNAME", "GIVENNAME", "MIDDLENAME", "POSITION", "INSTITUTIONNAME", "USERID", "REGISTEREDDATE" FROM "MEMBERINFO" WHERE ("USERID" = ?)">
<SelectParameters>
<asp:Parameter Name="USERID" Type="Object" />
</SelectParameters>
</asp:SqlDataSource>
Ernie在尝试访问它之前,您应该检查以确保currentUser不为null:
if ( currentUser != null )
{
/* do stuff here */
}
else
{
/* do something else, like show an error message perhaps */
}
请尝试以下代码:
string username = HttpContext.Current.User.Identity.Name;
if(!string.IsNullOrEmpty(username))
{
MembershipUser currentUser = Membership.GetUser(username);
Guid currentUserId = new Guid(currentUser.ProviderUserKey.ToString());
}
您似乎允许匿名用户访问需要登录用户的页面。如果用户尚未登录,则无法获取该用户
安全性由授权和身份验证两部分组成。身份验证正在登录,但授权正在拒绝未经授权的用户(例如尚未登录或未分配正确角色的用户)访问页面
如果您的页面依赖于经过身份验证的用户,则应拒绝匿名用户访问。如果页面不依赖于经过身份验证的用户,而只是在经过身份验证的情况下使用成员信息,那么您需要防止在用户未经身份验证的情况下调用成员函数(或任何使用成员数据的操作)。问题在于错误代码。
尝试以下步骤:-
在您的网站中,将“起始页”设置为正确的“登录”页。
正确登录并登录到页面后,您应该能够访问此属性。
如果您单击“注销”按钮,并且登录页可能引用了此成员信息,则可能会出现相同的错误
因此,解决方法很简单。
1.正确设置起始页。
2.处理两种情况:-用户登录和用户未有效登录。
一个例子如下:-
受保护的无效页面加载(对象发送方、事件参数e)
{
currentUser是否为空?您是否检查过该请求。IsAuthenticated是否为真?感谢您的快速回复。我认为它不是空的,因为我的场景是,他们每次登录后访问那里的配置文件时,代码都会执行。我没有检查该请求。IsAuthenticated,您可以给我一个例子吗。这看起来真的像currentUser对我来说是空的(从查看您在下面问题的答案中所做的更改可以看出,情况确实如此)。在Guid currentUser=…行上放置一个断点,然后在监视窗口中检查System.Threading.Thread.CurrentPrincipal.Identity.Name,然后确保这是您登录的用户的用户名。谢谢您的快速回复。我尝试使用了您发布的代码,我是这样做的protected void UserProfileDataSource_正在选择(对象发送方,SqlDataSourcesSelectingEventArgs e){//获取对当前登录用户成员身份的引用user currentUser=Membership.GetUser();if(currentUser!=null){Guid currentUserId=(Guid)currentUser.ProviderUserKey;e.Command.Parameters[“USERID”].Value=currentUserId;}}
您可以按照自己的喜好执行检查,您只需确保它不为null,然后再尝试使用它。:)但是,UserProfileDataSource.Select(DataSourceSelectArguments.Empty)上发生了相同的错误
line UserProfileDataSource为null或Select返回null
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:-";
}
}