4

我希望能够在每个页面上显示有关成员(“用户”)的各种详细信息 - 即显示一些登录详细信息的部分。

例如,stackoverflow 在每个页面上显示我的用户名、我的声誉和徽章。

堆栈溢出示例

由于我们喜欢坚持使用 ViewModel,因此填充 ViewModel 并将其传递给每个页面似乎是明智的。ViewModel 将包含成员对象(可能还有其他数据)。

一种方法是创建一个抽象的“基础”ViewModel 类,并让您通常使用的所有其他 ViewModel 都继承自它。这似乎有点麻烦,因为您制作的每个 ViewModel 都必须从基础继承。恼人的?

另一种方法是使用HttpContext.User.Identity.

另一种方法是创建自定义 WebViewPage。

但是对于这两种可能性,我被告知不建议这样做,因为它“不是非常 MVC-ish”。也就是说,它不符合我们在 MVC 中做事的自然方式。

我该如何解决这个问题?ViewModel 是要走的路吗?

C# 或 VB.NET 是可以接受的。

4

2 回答 2

6

Create a controller that returns user info in a partial, call the controller with Html.Action() in your layout page. A blog post I wrote long time ago which you may can check: http://kazimanzurrashid.com/posts/viewdata-or-viewbag-avoid-dependency-pollution-in-asp-dot-net-mvc-controller

于 2013-06-20T06:17:41.417 回答
1

虽然作为一项规则我会避免ViewBag,但在传递用户信息时我会例外。在我的基本控制器中,我将设置ViewBag.UserInfoforonActionExecuted并且它对所有视图都可用,如下所示:

@{
    var userInfo = ViewBag.UserIno as UserInfo;
}

如果您使用接口或抽象基础,则需要确保您查看的所有模型都填充用户字段。这确实增加了您的视图模型的开销。

于 2013-06-20T01:59:04.970 回答