3

我正在开发一个 MVC 应用程序,该应用程序将由一些内部(即经过 Windows 身份验证的)员工使用。对我来说不幸的是,我们的 Active Directory 帐户不知道每个员工的 ID——我们的员工数据库根本不与 AD 对话(我知道这会让人畏缩)。

无论如何,网站必须记录每个员工的 ID,因为他或她对各种记录进行更改。过去(在 ASP.NET WebForms 中),我会在 Session 中添加对自定义类的引用,并使用它来检查访问、获取员工 ID 并在顶部显示员工的全名应用。

我将如何在 MVC 中执行此操作?我知道我可以将数据添加到 Session,但我找不到任何方法来干净地引用 _Layout.cshtml 文件中的 Session 数据,老实说,我更愿意将这些数据存储在一个我可以获取 Intellisense 的类中,而不是使用数组索引器。是我太挑剔了吗?

明确一点:我试图弄清楚如何在布局或母版页中引用存储在自定义类中的信息,或者这只是一个完全愚蠢的想法。

4

3 回答 3

3

正如 Christopher 所说,从企业设计的角度来看,强类型视图是最好的方法。但是,它在您的布局中的事实让您感到困惑。您需要做的是在您的布局中,调用将呈现您想要的内容的控制器操作,并且它返回的视图被强类型化为包含您需要显示的所有数据的视图模型。

假设您想写出一个用户菜单,其中包含一些选项,具体取决于他们的安全访问权限,以及“欢迎 Bob Ross”消息(假设 Bob 已登录)。

所以在你看来你的_Layout你会有一个像......

        <div id="header" class="header">
            @{ Html.RenderAction("RenderUserMenu", "Home"); }
        </div>

现在,在 Home 控制器中,您有一个名为 RenderUserMenu 的操作,看起来有点像

public ActionResult RenderUserMenu()
        {
            var currentUser = DataManager.GetCurrentUser();
            return PartialView("_UserMenu", currentUser);
        }

这个菜单是一个域用户对象的强类型,所以在那个视图中,你现在可以打印出你想要的关于用户的任何信息,它是 _Layout 的一部分,并显示在从它继承的每个页面上。

这里唯一的巫术是 DataManager.GetCurrentUser() 函数,但我希望你有某种类型的基础设施来获取控制器中任何地方的当前用户。如果不是,它只是一个从会话中提取用户密钥、查询数据库并使用用户数据填充域对象的函数。如果您使用的是 Entity Framework 或 NHibernate 之类的 ORM,那就更容易了。

于 2013-04-10T22:02:33.460 回答
2

如果您需要在自己的模型/类中传递用户信息,这类似于此问题/答案

使用 MVC4 将数据放入局部视图或布局

于 2013-04-10T21:51:44.860 回答
1

您可能想要使用强类型视图。

http://www.asp.net/mvc/tutorials/views/dynamic-v-strongly-typed-views

您可以按照 Phil Haack 的这篇文章中的描述更改基本视图类型。

http://haacked.com/archive/2011/02/21/changeing-base-type-of-a-razor-view.aspx

于 2013-04-10T21:46:35.827 回答