我有一些代码可以根据当前上下文获取用户,这种情况发生在我的应用程序的Page_Load()
方法中。
var context = new PrincipalContext(ContextType.Domain, "dc", "DC=domain,DC=com", "user", "password");
UserPrincipal user = UserPrincipal.FindByIdentity(context, User.Identity.Name);
string Name = user.Name.Trim();
lblName.Text = Name;
这样做并且标签正确显示登录用户(Windows身份验证)。
但是,我的代码的另一部分,在按下按钮时,会在包含其他用户名的数据网格中循环,并使用类似的方法来获取有关这些用户的信息。
我在页面上使用了标签来显示相关的用户信息,但其中一个标签似乎根据它在循环中处理的用户而发生变化,而实际上只需要参考当前记录的用户在用户中。
有解决方法吗?我认为通过使用基本上做同样事情的单独方法,我会得到不同的对象。返回值不同,所以我不确定这是怎么回事。
下面的相关代码,附有一些注释,用于解释或指出代码不相关的位置(发送电子邮件和处理异常 - 全部删除)。
public string getUserEmail()
{
var context = new PrincipalContext(ContextType.Domain, "dc", "DC=domain,DC=com", "user", "password"); ;
UserPrincipal user = UserPrincipal.FindByIdentity(context, User.Identity.Name);
string email = user.EmailAddress;
return email;
}
public string getOtherUserEmail(string user)
{
user = user.Trim();
var context = new PrincipalContext(ContextType.Domain, "dc", "DC=domain,DC=com", "user", "password");
UserPrincipal u = UserPrincipal.FindByIdentity(context, user);
string email2= u.EmailAddress;
return email2;
}
protected void btnEmail_Click(object sender, EventArgs e)
{
foreach (GridViewRow row in gdView1.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
Label FullName = gdView1.Rows[index].FindControl("lblFullName") as Label; // other username from gridview
string FromAddress = getUserEmail(); //logged in user
try
{
string otherName = FullName.Text.ToString();
string ToAddress1 = getOtherUserEmail(FullName); //Other user
//Generate an email message....
smtpClient.Send(mail);
lblMessage.Text = "Email sent!";
}
catch
{ // exception handling
}
}
}
protected void gdView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
TableCell cell = gdView1.Rows[e.RowIndex].Cells[2]; //Cell containing "other" user name
Message.Text = cell.Text;
string otherName = cell.Text.ToString();
string ToAddress = getOtherUserEmail(otherName); //Other user
string FromAddress = getUserEmail(); //logged in user
try
{ //email as above
}
catch
{ // exception handling
}
}
答案 0 :(得分:2)
根据您发布的内容,我希望您也可以获得不同的对象。也许在你还没有包含的代码中发生了什么?
在旁注中,对于当前登录的用户,您应该在_loggedOnUser
之外定义一个字段(称为Page_Load()
)。这样所有方法都可以访问它。这样可以使您的代码更容易理解,甚至可以解决您的参考问题。
public partial class Page1 {
UserPrincipal _loggedOnUser;
public void Page_Load() {
var context = new PrincipalContext(ContextType.Domain, "dc", "DC=domain,DC=com", "user", "password");
_loggedOnUser= UserPrincipal.FindByIdentity(context, User.Identity.Name);
string Name = _loggedOnUser.Name.Trim();
lblName.Text = Name;
}
}
然后你可以在课程的其他部分引用它,而且你不必浪费时间回到你的循环中的Active Directory。
因此,这一行:string FromAddress = getUserEmail();
可以更改为string FromAddress = _loggedOnUser.EmailAddress;
并且您可以避免另外一次昂贵的AD调用来获取您已有的信息。