mvc 视图中的范围问题导致 IList<t> 失败(是:如何在 mvc 视图中实例化列表<t>)

scoping issue in mvc view causing IList<t> to fail (was: how to instantiate list<t> in mvc view)

我有一个 Session 变量,它有一个列表:

Session["roles"] = UserManager.GetRoles(uid) as List<string>;

完全有效
但现在我想在我的布局中使用它:

@{
List<string> rolz = Session["roles"] as List<string>;
}@

不幸的是我一直收到这个错误:
使用通用类型 "system.collections.generic.list" 需要 1 个类型参数

我看到了传递列表的例子
但是我如何使用已经存在的 session var 已经是一个列表?

更新 1:
请注意:
我有兴趣检索 Session["roles"] IN THE VIEW
不在另一个控制器中
因此,视图吐出错误
因为我认为它不喜欢这种语法 "List"
因为当我编码它时,它一直试图像这样智能感知它:

List<string></string>

更新 2:已调整标题以反映此问题的正确性质

正确使用UserManager.GetRoles并将其放入HttpSessionState的方法应该是这样的:

Session["roles"] = UserManager.GetRoles(uid).ToList(); // stores List<string>

上面的分配将 List<string> 存储到会话变量中,然后您可以在那里检索角色列表:

@{
    var rolz = Session["roles"] as List<string>;
}

请注意 UserManager.GetRoles 方法 returns IList<string> 可能与 List<string> 不同,因此需要 ToList 方法才能获得正确的 List类型。

参考:

Asp MVC: How get roles from ApplicationUser

感谢@tesuya 为我指明了正确的方向
似乎真正的答案与拉出会话值无关
而是一个范围界定问题
原始完整代码如下所示:

@{
     string me = @ViewContext.RouteData.Values["controller"].ToString() + "-" + @ViewContext.RouteData.Values["action"].ToString();
     string jscript = "/Scripts/es/" + me + ".js";
}

然后当我添加会话变量时它失败了:

@{
    string me = @ViewContext.RouteData.Values["controller"].ToString() + "-" + @ViewContext.RouteData.Values["action"].ToString();
    string jscript = "/Scripts/es/" + me + ".js";
    var rolz = Session["roles"] as List<string>;
}

但是当我这样做时一切正常:

@{
    var rolz = Session["roles"] as List<string>;
    string me = @ViewContext.RouteData.Values["controller"].ToString() + "-" + @ViewContext.RouteData.Values["action"].ToString();
    string jscript = "/Scripts/es/" + me + ".js";
}

因此导致问题的违规行是这样的:

    string me = @ViewContext.RouteData.Values["controller"].ToString() + "-" + @ViewContext.RouteData.Values["action"].ToString();

我还没弄明白为什么
但这是另一个 post 的问题...
(上面用野蛮人柯南的语气说的)