我希望能够在每个页面上显示有关成员(“用户”)的各种详细信息 - 即显示部分登录详细信息的部分内容。
例如,stackoverflow在每个页面上显示我的用户名,我的声誉和徽章。
由于我们喜欢坚持使用ViewModel,因此填充ViewModel并将其传递给每个页面似乎是明智的。 ViewModel将包含成员对象(可能还有其他数据)。
执行此操作的一种方法是创建一个抽象的“基础”ViewModel类,并让您通常使用的所有其他ViewModel都从中继承。这看起来有点麻烦,因为你制作的每个ViewModel都必须从基础开始。恼人的?
另一种方法是使用HttpContext.User.Identity
。
另一种方法是创建自定义WebViewPage。
但是对于这两种可能性我已经被告知不推荐它,因为它“不是非常MVC-ish”。也就是说,它不符合我们在MVC中做事的自然方式。
我该如何解决这个问题? ViewModels是可行的吗?
C#或VB.NET是可以接受的。
答案 0 :(得分:6)
创建一个部分返回用户信息的控制器,在布局页面中使用Html.Action()调用控制器。我很久以前写的一篇博文,您可以查看: http://kazimanzurrashid.com/posts/viewdata-or-viewbag-avoid-dependency-pollution-in-asp-dot-net-mvc-controller
答案 1 :(得分:1)
虽然我通常会避免使用ViewBag
,但在传递用户信息时我会例外。在我的基本控制器中,我将为ViewBag.UserInfo
设置onActionExecuted
,并且所有视图都可以使用以下内容:
@{
var userInfo = ViewBag.UserIno as UserInfo;
}
如果使用接口或抽象基础,则需要确保所有查看模型的用户填充用户字段。这确实增加了视图模型的开销。