总体情况是这样的:当用户登录时,他们可以从下拉列表中选择一个“组织”来登录,该列表具有每个组织的唯一ID#。当用户登录时,我想从我的人员表中获取他们的ID#。问题是,这个人可能会在桌子上两次,如下:
ID Name OrgID
1 Brandon 1
2 Brandon 2
因此,要获取适当的人员ID,我还需要检查OrgID。这是我在GET方法中得到的结果:
public ActionResult Index()
{
ViewBag.Organization = new SelectList(db.Organizations, "OrgID", "OrgName");
return View();
}
这是我的POST方法:
[HttpPost, ActionName("Submit")]
public ActionResult SubmitPost(string LoginNID, string LoginPassword, LoginViewModel model)
{
//Create new instance of ActiveDirectoryHelper to access its methods
ActiveDirectoryHelper login = new ActiveDirectoryHelper();
//Get Username and Password from forms
String Username = LoginNID;
String Password = LoginPassword;
int OrgID = model.Organizations.OrgID;
//ViewBag initialization for error message
ViewBag.NumTimes = 0;
ViewBag.Message = "Error logging in, please try again.";
//LDAP Authentication
bool LoginPassed = login.IsAuthenticated(Username, Password);
int Organization = organizations.OrgID;
//if Authentication Success enter site, otherwise Return error message
if (LoginPassed == true)
{
//grabs the one person from the People model whose NID is == to Username
var peopleModel = db.People.Single(g => g.NID == Username);
//grabs the peopleID for use in making a session variable
var peopleID = peopleModel.PeopleID;
//sets a session variable to be used that is the logged in person's ID
Session["peopleID"] = peopleID;
return View("LoginSuccess");
}
else
{
ViewBag.NumTimes = 1;
ViewBag.Organization = new SelectList(db.Organizations, "OrgID", "OrgName", organizations.OrgID);
return View("Index");
}
}
这是我的ViewModel:
public class LoginViewModel
{
public Music.Models.Organizations Organizations { get; set; }
}
关于如何获取组织的ID#然后选择唯一的人ID#的任何想法,以便我可以将其作为会话变量?非常感谢!
编辑:更新的代码,以反映我根据提供的答案所做的更改。
答案 0 :(得分:2)
您可以使用id创建一个类似会话信息的类,以便在登录后立即捕获该信息。让您的登录名执行登录验证,然后路由到会话信息页面,您可以在该页面中选择基于用户可用组织的组织。将它传递给你的助手类,将其存储在会话信息中。
修改
重新阅读您的问题后,您可以在登录页面上提供组织列表,并针对您当前正在执行的操作进行验证,并确保其与组织匹配,因此只有一个屏幕。
public class LoginCredential
{
public string UserName { get; set; }
public string Password { get; set; }
public int OrganizationId { get; set; }
}
public ActionResult Index()
{
ViewBag.Organizations = new SelectList(db.Organizations, "OrgID", "OrgName");
return View();
}
使登录页面的模型成为登录凭证
@model MyProject.Models.LoginCredential
然后,当您从表单提交时,它将传递所选的选项。
[HttpPost, ActionName("Submit")]
public ActionResult Login(LoginCredential credentials)
{
String Username = credentials.UserName ;
String Password = credentials.Password ;
Int OrganizationId = credentials.OrganizationId;
/// Rest of your code goes here
}
答案 1 :(得分:-1)
根据kadumel的答案创建ViewModel后,我仍然遇到与以前相同的错误。由于用户名和密码都是从视图中回发的,因此我只需要视图使用1个模型来获取OrgID。我所做的是将我视图中的@model指令更改为:
@model Music.Models.Organizations
然后将POST中的参数更改为:
public ActionResult SubmitPost(Organizations model, string LoginNID, string LoginPassword)
从那里,我通过这样做得到了OrgID:
int OrgID = model.OrgID;
从调试开始,OrgID最终获得了正确的值,它表示" model"的值。不再是空的。虽然这有效,但我并不完全确定原因,因为我认为使用ViewModel会做同样的事情,因为我的ViewModel包含了Organizations模型。
编辑:我弄清楚为什么这样做起来并且使用ViewModel似乎没有:在我看来我有
@Html.DropDownList("Organization", ViewData["Organizations"] as SelectList, "--Select Organization--")
第一个参数"组织"在我的模型中没什么,所以模型当然会返回null而不是给我ID。当我把它改为:
@Html.DropDownList("OrgID", ViewData["Organizations"] as SelectList, "--Select Organization--")
它传回了身份证,我很高兴。