将数据传输到ApplicationController

问题描述:

我正在尝试使用视图母版页执行登录模块。第一个用户使用登录表单访问主页,当用户单击登录时,页面应该首先重定向到UserLoginController,然后重定向到另一个PanelController,该页面包含具有相同主页面的所有页面。我想通过不同用户的许可显示不同的菜单。当我参考文章http://www.asp.net/mvc/tutorials/passing-data-to-view-master-pages-cs我创建了一个抽象类ApplicationController,PanelController继承它。在构造函数中,我想获取登录用户的信息来识别用户的权限,但似乎Request和Session不可用。请参阅代码。将数据传输到ApplicationController

首先登录的Javascript

<script type="text/javascript" language="javascript"> 
    $(document).ready(function() { 
     $(btnLogin).click(function() { 
      var sso = $(txtSSO).val(); 
      var pwd = $(txtPwd).val(); 
      if (sso == "") 
      { alert("Please input your SSO number"); } 
      else if (pwd == "") 
      { alert("Please input your password"); } 
      else { 
       jQuery.ajax(
       { url: '<%:Url.Action("UserLogin", "UserLogin")%>', 
        data: { sso: sso, pwd: pwd }, 
        success: function (data) { 
         window.location = '<%: Url.Action("Demo","Panel") %>'; 
        } 
       } 
       ); 
      } 
     }); 
    }); 

</script> 

的UserLoginController

public ActionResult UserLogin() 
    { 
     string sso = ""; 
     string pwd = ""; 
     try 
     { 

      if (Request.IsAjaxRequest()) 
      { 
       sso = Request.Params["sso"].ToString(); 
       pwd = Request.Params["pwd"].ToString(); 
      } 

      Regex reg = new Regex("^[0-9]{9}$"); 
      if (!reg.Match(sso).Success || pwd == "") 
      { 
       ViewData["errorMsg"] = "Either your UserID or your Password is incorrect"; 
       return View("Index"); 
      } 
      SystemAdminEntities entity = new SystemAdminEntities(); 
      var result = entity.ValidateUserLogin(sso, pwd).FirstOrDefault(); 

      if (result == 1)//User is found 
      { 
       int isso = Convert.ToInt32(sso); 
       var dbEmp = (from e in entity.sys_employee 
          where e.sso == isso 
          select e); 
       SysEmployee emp = dbEmp.FirstOrDefault<SysEmployee>(); 
       LogonUserModel currentUser = LogonUserModel.GetUser(); 
       currentUser.CopyUserInfo(emp); 

       //FormsAuthenticationTicket ticket=new 
       FormsAuthentication.SetAuthCookie(currentUser.SSO.ToString(), true); 
       Session.Add("emp", currentUser); 
       this.Session.Add("sso", currentUser.SSO); 
       this.Session.Add("empid", currentUser.EmpID); 
       this.Session.Add("ename", currentUser.EName); 
       return RedirectToAction("Demo", "Panel");//重定向到 Demo 
      } 
      else if (result == 0)//User is not found 
      { 
       ViewData["errorMsg"] = "User isn't found"; 
       return View("Index"); 
      } 
      else if (result == 2)//Password not correct 
      { 
       ViewData["errorMsg"] = "Password Error"; 
       return View("Index"); 
      } 
      return View("Index"); 
     } 
     catch { return View("Index"); } 
    } 

的ApplicationController中

public abstract class ApplicationController : Controller 
{ 
    private SystemAdminEntities _entities = new SystemAdminEntities(); 

    public ApplicationController() 
    { 
     //根据人员判断权限 
     int sso = 0;//= Request.Form["sso"].ToString(); 
     try 
     { 
      sso = int.Parse(Session["sso"].ToString()); 
      var e = (from emp in _entities.sys_employee//得到对应的用户 
        where emp.sso == sso 
        select emp 
       ); 
      SysEmployee loginUser = e.FirstOrDefault<SysEmployee>(); 
      ViewData["modules"] = loginUser.SysHasPerm; 
     } 
     catch 
     { 
      ViewData["modules"] = null; 

     } 

    } 

的PanelController

public class PanelController : ApplicationController 
{ 

    // 
    // GET: /Panel/ 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult Demo() 
    { 
     return View(); 
    } 

} 

ViewData的是MVC用于从Controllor传递数据查看

和TempData的用于从一个Controllor数据传递到其他

参见Passing State Between Action Methods

See this example for Step by step -