You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET中如何配置自定义类对象的Get/Set访问器以实现用户专属属性?

解决静态属性导致用户共享数据的问题

我来帮你搞定这个问题——你遇到的核心矛盾就是静态成员的全局共享特性和你需要的「每个用户数据独立」需求完全不匹配,咱们一步步修正:

问题根源

你代码里的SurveyETA类属性都是static,还定义了静态的RespondentETA实例。静态成员是属于整个类的,不是某个对象实例的,所以所有用户访问的都是同一个内存地址里的值,自然会出现数据串用的问题。另外你在静态实例初始化里写属性访问器的方式也是语法错误,访问器得定义在类内部,不能在实例初始化的时候写。

修正方案

1. 把类的属性改成实例属性(去掉static)

首先修改SurveyETA类,移除所有属性的static修饰符,同时把属性的get/set直接绑定到当前用户的Session——因为Session本身就是每个用户会话独有的,完美匹配你的需求:

public class SurveyETA {
    // 用空合并运算符简化null判断,比三目运算符更简洁
    public string Question1 { 
        get => HttpContext.Current.Session["RespondentQ1"]?.ToString() ?? "";
        set => HttpContext.Current.Session["RespondentQ1"] = value;
    }

    public string Question2 { 
        get => HttpContext.Current.Session["RespondentQ2"]?.ToString() ?? "";
        set => HttpContext.Current.Session["RespondentQ2"] = value;
    }

    public string Question3 { 
        get => HttpContext.Current.Session["RespondentQ3"]?.ToString() ?? "";
        set => HttpContext.Current.Session["RespondentQ3"] = value;
    }

    public string Question4 { 
        get => HttpContext.Current.Session["RespondentQ4"]?.ToString() ?? "";
        set => HttpContext.Current.Session["RespondentQ4"] = value;
    }

    public string Question5 { 
        get => HttpContext.Current.Session["RespondentQ5"]?.ToString() ?? "";
        set => HttpContext.Current.Session["RespondentQ5"] = value;
    }

    public string Question6 { 
        get => HttpContext.Current.Session["RespondentQ6"]?.ToString() ?? "";
        set => HttpContext.Current.Session["RespondentQ6"] = value;
    }
}

2. 为每个用户创建/获取专属实例

不要用静态的RespondentETA变量,而是在需要使用的地方(比如Controller、页面逻辑里),从当前用户的Session中获取或创建实例:

// 示例:在Controller里获取当前用户的SurveyETA实例
private SurveyETA GetCurrentUserSurvey()
{
    // 从Session里取当前用户的实例
    var survey = HttpContext.Session["CurrentUserSurvey"] as SurveyETA;
    
    // 如果Session里没有,就新建一个并存进去
    if (survey == null)
    {
        survey = new SurveyETA();
        HttpContext.Session["CurrentUserSurvey"] = survey;
    }
    
    return survey;
}

// 使用示例
public IActionResult SaveSurvey()
{
    var userSurvey = GetCurrentUserSurvey();
    userSurvey.Question1 = "用户的答案1";
    // ... 其他属性赋值逻辑
    return Ok();
}

为什么这样改就没问题?

  • 去掉static后,每个SurveyETA实例的属性不再是全局共享的,而我们把属性的读写直接绑定到当前用户的Session——Session是ASP.NET为每个用户会话单独维护的存储区域,不同用户的Session完全隔离,所以数据自然不会串。
  • 不再用全局静态实例,而是每个用户操作自己Session里的实例,彻底避免了多用户数据共享的问题。

内容的提问来源于stack exchange,提问作者Borrek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:57:51