通用 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();
}
}
GetCurrentProfile
和 SetCurrentProfile
可直接用于您想要的控制器,因为我们直接从 BaseController
.
继承了它
您可以在上面的代码片段中使用try/catch
。
试一次对你有帮助
我正在使用 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();
}
}
GetCurrentProfile
和 SetCurrentProfile
可直接用于您想要的控制器,因为我们直接从 BaseController
.
您可以在上面的代码片段中使用try/catch
。
试一次对你有帮助