Session variables 会话变量值在WebMatrix中的网页上不可用

Session variables 会话变量值在WebMatrix中的网页上不可用,session-variables,webmatrix,Session Variables,Webmatrix,我想在我的WebMatrix网页中使用会话变量 由于未知原因,在页面间不可用(仅适用于定义它们的页面) 在我的登录页面的代码部分: if (WebSecurity.Login(userName, password, rememberMe)) { // Session variable holding the UserType var db = Database.Open("MyDatabase"); var userTypeData = db.QuerySingle(

我想在我的WebMatrix网页中使用
会话变量

由于未知原因,
在页面间不可用(仅适用于定义它们的页面)

在我的登录页面的代码部分

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);
    }
我在这里得到一个
“无法对空引用执行运行时绑定”
,因此如果总是存在用户类型。这是第一个问题

在重定向的“authenticated”页面中,如果我使用完全相同的查询和会话变量定义,我可以将其显示为:

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>    
 }
@if(Session[“UserType”]=“此处为变量值;字符串”){
}

按钮从不显示,因为会话变量显示为空

更改代码以测试查询是否存在问题(顺便说一句,如果只需要用户名,请使用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();

当项目存储在会话中时,它存储为对象数据类型,因此如果对象和原始类型之间没有隐式转换,则需要将其转换回其原始数据类型。()

->会话[“UserType”]
.ToString()

@if(Session[“UserType”].ToString()=“此处为变量值;字符串”){

}

尝试这种方式{var newObj=Session[“UserType”];}然后检查if条件。尝试使用
Session[“UserType”]”读取会话变量值。ToString()
而不是
Session[“UserType”]
。如果从if条件中取出该值->@Session[UserType]单独工作,则该值将显示在其他页面上。我们至少知道问题在哪里!会话变量是一个对象(SQL查询的结果),if条件测试字符串。也许这里需要一些演员?是的。就是这样。请编辑您的解决方案,我将接受它。顺便说一下,我还有其他一些问题没有回答。如果你有空闲时间;-)我又回来了。几分钟后,我遇到了以下错误:对象引用未设置为对象的实例。第109行:@if(会话[“UserType”].ToString()=“Syndic”){button link}。我登出并再次登入,它似乎已经消失了。但是要多久?你知道如何防止这种情况吗?在每个页面上声明另一个变量以保存会话变量的值?
@if (Session["UserType"].ToString()=="here the variable value; a string") {
            <a class="linkbutton" href="condoedit?condoId=@condoData.CondoId">Update</a>