通用 class 用于识别 ASP.Net MVC 应用程序中的当前会话信息

Generic class to identify Current Session information in ASP.Net MVC application

我正在使用 ASP.Net MVC 开发一个简单的基于自定义角色的 Web 应用程序,在我的登录操作中,我正在创建一个配置文件会话,如下所示:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    using (HostingEnvironment.Impersonate())
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                var employeeProfile = AccountBal.Instance.GetEmployee(loginId);
                Session["Profile"] = employeeProfile;
                FormsAuthentication.SetAuthCookie(model.UserName, true);
            }
        }
        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", @"The user name or password provided is incorrect.");
        return View(model);
    }
}

我正在检查这个或在所有控制器操作中使用这个会话,如下所示:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateOrEdit(MyModel model)
{
    var employee = (Employee) Session["Profile"];
    if (employee == null) 
       return RedirectToAction("Login", "Account");

    if (ModelState.IsValid)
    {
        // Functionality goes here....
    }
}   

有什么方法可以将这段会话检查代码移动到基础 class 或集中式 class 中吗?这样,我就不需要每次都在控制器操作中检查它,而是直接访问属性

说,

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateOrEdit(MyModel model)
{
    var employee = _profileBase.GetCurrentProfile();
    if (employee == null) 
       return RedirectToAction("Login", "Account");

    if (ModelState.IsValid)
    {
        // Functionality goes here....
    }
}  

创建一个基本控制器,其中包含您的 GetCurrentProfile 方法来检索当前用户配置文件,例如

public class BaseController : Controller
{
    public Employee GetCurrentProfile()
    {
        return (Employee)Session["Profile"];
    }

    public bool SetCurrentProfile(Employee emp)
    {
        Session["Profile"] = emp;
        return true;
    }
}

并使用上面的 BaseController 继承您想要的控制器并访问您的 GetCurrentProfile 方法,如下所示

public class HomeController : BaseController
{
    public ActionResult SetProfile()
    {
        var emp = new Employee { ID = 1, Name = "Abc", Mobile = "123" };

        //Set your profile here
        if (SetCurrentProfile(emp))
        {
            //Do code after set employee profile
        }
        return View();
    }

    public ActionResult GetProfile()
    {
        //Get your profile here
        var employee = GetCurrentProfile();

        return View();
    }
}

GetCurrentProfileSetCurrentProfile 可直接用于您想要的控制器,因为我们直接从 BaseController.

继承了它

您可以在上面的代码片段中使用try/catch

试一次对你有帮助