对于控制器中的某些用户,公共字段是不是具有不同的值? [复制]

Posted

技术标签:

【中文标题】对于控制器中的某些用户,公共字段是不是具有不同的值? [复制]【英文标题】:Is public field has different values for some users in controller? [duplicate]对于控制器中的某些用户,公共字段是否具有不同的值? [复制] 【发布时间】:2015-01-04 10:04:55 【问题描述】:

我有三个action方法和public field public int idUser:

public class HomeController : Controller
   
    //public field 
    public int idUser = 0; 

    public ActionResult Index()
       
        string userLogin = User.Identity.Name;                        
        using (SmoothEntities db = new SmoothEntities())
                        
            idUser = (db.Users.Where(c => c.Name == userLogin).First()).ID_User;
            return View(db.Employees.Where(u => u.ID_User == idUser).ToList());
          
    
    public ActionResult About()
    
        string userLogin = User.Identity.Name;            
        int idUser = 0;
        using (SmoothEntities db = new SmoothEntities())
                        
            idUser = (db.Users.Where(c => c.Name == userLogin).First()).ID_User;
            return View(db.Employees.Where(u => u.ID_User == idUser).ToList());
          
    

    public ActionResult Contact()
                
        return View();
    

让我们假设 Bob 和 Bill 同时登录到该网站。如果 Bob 将执行 public ActionResult Index() 并且 Bill 将执行 public ActionResult About(),那么 Bob 和 Bill 将有两个不同的公共字段 idUser 值,我对吗?

为什么要使用公共字段?由于我不想总是在 Action 方法中从服务器访问数据,我认为这会降低我网站的性能,所以我决定创建公共字段。

【问题讨论】:

全局变量是不好的做法!使用 Web-Caching 或 Session 来保存用户 ID!例如,您将在登录时获取 UserId,因此将其存储在那里并再次在控制器中使用它,无需浪费时间和资源再次请求它。 “我认为这会降低我网站的性能” - 使用类级别变量而不是局部变量不会对性能产生任何明显影响。 【参考方案1】:

Bob 和 Bill 有两个不同的值,我说得对吗? 公共字段 idUser 如果 Bob 将执行 public ActionResult Index() 并且 Bill 会执行 public ActionResult About()?

是的,你是对的(即使他们执行相同的方法)。

默认情况下,对于到达 asp.net mvc 的每个请求,asp.net mvc 都会创建一个控制器的新实例来为请求提供服务,这样它们就不会共享字段价值观。

【讨论】:

不是 Web API,它是 MVC... @Ricardo Peres:一个错误,但它们相似。我已经更新了,谢谢。【参考方案2】:

无论这是否是一个好主意,是的,每个请求都会有一个不同的控制器类实例,因此字段也是如此。您可以通过实现一个控制器构建器来覆盖此行为,该构建器以某种方式缓存并向所有/某些请求返回相同的控制器实例。如果您只想共享您的字段,请将其设为静态。

【讨论】:

以上是关于对于控制器中的某些用户,公共字段是不是具有不同的值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如果 PIG 中的第二个字段具有不同的值,如何过滤/删除记录

Laravel Lighthouse 中的授权

如何加入具有不同 CONTENT_ITEM_TYPE 但共享一个公共字段的记录,即 RAW_CONTACT_ID?

Prisma 如何仅更新 update() 中的某些模型字段

无法通过 DataTemplates 设置控制的可见性

具有公共字段的不同 api 的 POJO 声明