【问题标题】:How to share same data one action method to other action method in ASP.NET MVC如何在 ASP.NET MVC 中将相同的数据一种操作方法共享给其他操作方法
【发布时间】:2017-10-12 19:26:37
【问题描述】:
  1. 当我调用我的管理控制器时,索引操作方法将获取所有用户详细信息
  2. 当我想再次选择特定用户时,我不想点击数据库。

两个动作方法相同的控制器,我正在使用模型弹出窗口来显示详细信息。

我的问题 我不想使用实体框架。 - 当管理表单加载时,我将获得所有用户详细信息,这是索引操作方法 -基于用户ID,我需要显示特定用户,所以我不想再访问数据库,因为我已经拥有所有用户详细信息。详细说明如何获取另一个操作方法?

我记得asp.net 我使用会话在全球范围内共享数据。像那个 asp.net mvc 是可能的吗?请帮帮我。

谢谢

【问题讨论】:

  • 是的,允许会话。但建议您不要使用 Session 并且可能将用户数据存储在隐藏的 html 或 JSON 对象中,然后发送到另一个操作
  • 您的视图如何?如果您在表中显示用户数据并且它包含与用户相关的表中存在的所有必需信息,那么您可以使用 jquery 获取特定用户的数据。
  • 感谢朋友的快速回复。我要问的不仅是用户数据,我还想避免每次都点击数据库,第一次页面加载时我会获取数据,我需要存储一些其他地方,然后每当我需要访问时。有什么想法吗?

标签: asp.net-mvc asp.net-mvc-4 c#-4.0


【解决方案1】:

看起来您正在寻找一种缓存机制。对于简单的场景,我使用一个简单的静态变量,但我将它保存在一个单独的类中。假设您有一个这样的 User 类:

public class User
{
    public string Id { get; set; }
    public string Name { get; set; }
}

你可以像这样创建一个类:

public static class UserCacheService
{
    private static IEnumerable<User> _users;
    private static readonly object lockObj = new object();

    public static IEnumerable<User> GetUsers()
    {
        lock (lockObj)
        {
            if (_users == null)
            {
                using (var db = new MyNiceDbContext())
                {
                    _users = db.Users.ToList();
                }
            }
            return _users;
        }
    }

    public static void InvalidateCache()
    {
        lock (lockObj)
        {
            _users = null;
        }
    }

}

然后你可以让你的 shared 用户在任何操作中,像这样的任何控制器:

public class AdminController : Controller
{

    public ActionResult Index()
    {
        // the first time, it'll need to get users from DB (e.g with Entity Framework)
        var users = UserCacheService.GetUsers();
        return View();
    }

}

第一次,UserCacheService 中的_users 将为空,并且正如预期的那样,它需要从数据库加载用户。但是,下次它不会,无论您是否使用另一个控制器:

public class AnotherController : Controller
{

    public ActionResult Index(string userId)
    {
        // now, it won't load from DB anymore, because _users is already populated...
        var users = UserCacheService.GetUsers();
        var currentUser = users.Where(u => u.Id == userId).FirstOrDefault();
        if (currentUser != null)
        {
            // do something with the user...
        }
        return View();
    }

}

不幸的是,有时您的_users 会再次变为null,例如当您在IIS 中重新启动您的ApplicationPool 时,但UserCacheService 已经准备好获取数据库一次,如果这是案例。

注意三件事:

  1. 每当您将数据保存在内存中(如_users)时,您都在消耗 您的服务器内存,这可能是有限的。不要开始尝试 将所有内容保存在内存中,只保留您知道每次都需要的数据。
  2. 每当您更新用户中的某些内容时,例如姓名、地址或其他内容,由于 _users 不会每次都从数据库中获取,您需要调用 UserCacheService.InvalidateCache() 方法,以强制下一次调用再次从数据库加载,从而确保 _users 是最新的。
  3. 这仅适用于简单的场景。如果您的应用程序分布在两台或多台服务器上,这将不起作用,因为每台服务器都有自己的内存,而且它们无法开箱即用地共享它。那时你会期待像 Redis 这样的东西。不过,我认为这不是你的情况。

【讨论】:

  • @SENA 不客气。如果它按您的预期工作,请不要忘记将其标记为已接受,以便我们知道它有效。
  • 嗨 Alisson,它工作正常。太感谢了。当我想调用此方法时,还有一个进一步的说明。公共静态无效 InvalidateCache() { lock (lockObj) { _users = null; } }
  • @SENA 每当您更新数据库中的用户详细信息时。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2010-12-19
相关资源
最近更新 更多