我正在开发一个MVC应用程序,该应用程序将由一些内部(即经过Windows身份验证的)员工使用。对我来说不幸的是,我们的Active Directory帐户并不知道每个员工的身份证 - 我们的员工数据库根本没有与AD交谈(我知道这很畏缩)。
无论如何,网站必须记录每个员工的ID,因为他或她对各种记录进行了更改。在过去(在ASP.NET WebForms中),我会在Session中添加对自定义类的引用,并使用它来检查访问权限,获取员工的ID,并在员工的顶部显示员工的全名。应用
我如何在MVC中执行此操作?我知道我可以向Session添加数据,但是我找不到任何方法来干净地引用_Layout.cshtml文件中的Session数据,而且我真的更愿意将这些数据存储在我可以获得Intellisense的类中,而不是使用数组索引器。我太挑剔了吗?
要明确:我正在尝试弄清楚如何在布局或母版页中引用存储在自定义类中的信息,或者这只是一个完整的愚蠢的想法。
答案 0 :(得分:3)
正如克里斯托弗所说,从企业设计的角度来看,强类型视图是最好的方法。但是,它在您的布局中的事实是令您感到困惑的事实。你需要做的是在你的布局中,调用一个控制器动作,它将呈现你想要的内容,并且它返回的视图,强烈地输入到包含你需要显示的所有数据的视图模型。 / p>
让我们说你要写一个用户菜单,有一些选项,取决于他们的安全访问,以及“欢迎Bob Ross”消息(假设Bob已登录)。
所以在你看来你的_Layout你会有像...这样的div。
<div id="header" class="header">
@{ Html.RenderAction("RenderUserMenu", "Home"); }
</div>
现在,在Home控制器中,您有一个名为RenderUserMenu的动作,看起来有点像
public ActionResult RenderUserMenu()
{
var currentUser = DataManager.GetCurrentUser();
return PartialView("_UserMenu", currentUser);
}
此菜单是对域用户对象的强类型,因此在该视图中,您现在可以打印出有关您想要的用户的任何信息,它是_Layout的一部分,并显示在从其继承的每个页面上。< / p>
这里唯一的伏都教是DataManager.GetCurrentUser()函数,但我希望你有一些类型的基础设施来让当前用户在控制器的任何地方。如果没有,它只是一个从会话中提取用户密钥的函数,查询数据库,并用用户数据填充域对象。如果您正在使用像Entity Framework或NHibernate这样的ORM,那就更容易了。
答案 1 :(得分:2)
如果您需要在自己的模型/类中传递用户信息,这与此问题/答案类似
答案 2 :(得分:1)
您可能想要使用强类型视图。
http://www.asp.net/mvc/tutorials/views/dynamic-v-strongly-typed-views
您可以按照Phil Haack的本文所述更改基本视图类型。
http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspx