您好:)我正在构建一个MVC5 / EF6系统,该系统存储有关具有多种用户类型的学生的信息。当用户登录有关用户的某些信息存储在Session中时; UserID,UserTypeID等。不同的用户拥有不同的权限,我经常需要在每个控制器的ActionResult方法中从Session获取用户信息:
private Student GetCurrentStudentInfo()
{
var currentuser = (SessionModel)Session["LoggedInUser"];
var student = _db.Student.Find(currentuser.UserID);
return student;
}
我在控制器的底部有这个方法,我根据我需要这些信息的时间从每个方法调用。它从当前登录用户获取userID并返回配置文件信息。我希望能够:
或者创建一个我可以在我的控制器顶部使用的类变量,它将返回此信息:
public class RegistrationWizardController : Controller
{
private readonly DefaultContext _db = new DefaultContext();
private UserInfo _userInfo = new UserInfo();
}
我对MVC和编码很新,所以欢迎任何帮助/意见/其他建议。谢谢!
答案 0 :(得分:0)
你有几个选择。
两者中的第一个(也更容易)是使所有控制器都从公共基本控制器继承。为此,请创建一个从默认控制器扩展的基本控制器:
public class BaseController : Controller
{
protected Student GetCurrentStudentInfo() //protected so we can access this method from derived classes
{
var currentuser = (SessionModel)Session["LoggedInUser"];
var student = _db.Student.Find(currentuser.UserID);
return student;
}
}
现在,更改控制器以继承刚刚创建的基本控制器:
public class RegistrationWizardController : BaseController
{
public ActionResult AnAction()
{
var student = this.GetCurrentStudentInfo(); //calls the method inherited from BaseController
}
}
您拥有的另一个选项是使用依赖注入。这比以前的方法更复杂,更抽象。有一堆依赖注入框架,我最喜欢的是Ninject(http://www.ninject.org/)。这可能更接近于做这样的事情的“行业标准”,我鼓励你至少研究它,但我认为这个问题的样本有点超出范围(先做一些阅读)。如果您决定实施并陷入困境,请发布另一个问题。