我想在我的WebMatrix网页中使用session variables
。
由于未知原因,它们是not available accross the pages
(仅限于定义它们的页面)。
在我的登录页面中,代码部分:
if (WebSecurity.Login(userName, password, rememberMe)) {
// Session variable holding the UserType
var db = Database.Open("MyDatabase");
var userTypeData = db.QuerySingle("SELECT Name FROM UserTypes INNER JOIN UserProfiles ON UserProfiles.UserTypeId = UserTypes.UserTypeId WHERE UserId = @0",WebSecurity.CurrentUserId);
Session ["UserType"] = userTypeData.Name;
// Eventual redirection to the previous URL
var returnUrl = Request.QueryString["ReturnUrl"];
if (returnUrl.IsEmpty()) {
Response.Redirect("~/auth/authenticated");
}
else {
Context.RedirectLocal(returnUrl);
}
我到这里"Cannot perform runtime binding on a null reference"
,因此总是有一个UserType。这是第一个问题。
在我被重定向的“已验证”页面中,如果我使用完全相同的查询和会话变量定义,我可以将其显示为:
You are a user of type: @Session["UserType"] -> HTML section
在其他网页上,我正试图通过会话变量'显示或隐藏(更新)按钮。
@if (Session["UserType"]=="here the variable value; a string") {
<a class="linkbutton" href="condoedit?condoId=@condoData.CondoId">Update</a>
}
按钮永远不会显示为session variable appears to be empty
!!
答案 0 :(得分:1)
更改代码以测试查询是否存在问题(BTW,如果只需要用户名,请使用QueryValue而不是QuerySingle)。
尝试类似
的内容var db = Database.Open("MyDatabase");
var userTypeData = db.QueryValue("SELECT Name FROM UserTypes INNER JOIN UserProfiles ON UserProfiles.UserTypeId = UserTypes.UserTypeId WHERE UserId = @0",WebSecurity.CurrentUserId);
if (String.IsNullOrEmpty(userTypeData)) {
Session["UserType"] = "IsEmpty";
} else {
Session["UserType"] = userTypeData;
}
如果会话变量值为“IsEmpty”,则在其他页面上进行测试。
修改强>
在其他页面中,将会话变量值转换为字符串并将其存储到本地变量
中var uType = Session["UserType"].ToString();
答案 1 :(得分:0)
当项目存储在会话中时,它将作为对象数据类型存储,因此如果对象和原始类型之间没有隐式转换,则需要将其转换回其原始数据类型。 (mikesdotnetting.com)
- &GT;会话[ “用户类型”] .ToString()
@if (Session["UserType"].ToString()=="here the variable value; a string") {
<a class="linkbutton" href="condoedit?condoId=@condoData.CondoId">Update</a>
}