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 的问题...
(上面用野蛮人柯南的语气说的)
我有一个 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 的问题...
(上面用野蛮人柯南的语气说的)