如何在不复制数据的情况下在站点中的页面之间共享静态数据?

时间:2014-08-06 04:46:39

标签: javascript html asp.net-mvc

我有一个数据列表,说“支持的颜色”。也许这些颜色都有一个名称,一组别名,一些代表这种颜色的特定RGB值。在我的网站中,我有一个页面,我想在下拉列表中列出颜色。在另一个页面中,我想要一个显示每种颜色的网格。也许在另一页,完全不同的东西。所以我的问题是:如何在页面之间共享数据,以便定义数据的一个位置的更改将传播到站点中的所有页面。

环境:这是一个MVC应用程序,使用Razor(节俭),用于演示的引导程序,以及用于某些交互操作的JQuery。

我对解决方案的看法:

1)将此列表存储在传递给所有页面的模型中。然后,只要需要数据,我就可以循环遍历模型中的项目,然后呈现它们,但是我想要

2)将列表存储在javascript中,然后使用javascript生成HTML。

3)使用JQuery从服务器获取列表,并迭代结果以生成相应的HTML

注意我对Web开发很新,所以上面可能会有一些错误的假设,而且大多数都是一些思路不好的想法 - 非常感谢任何更正!

3 个答案:

答案 0 :(得分:2)

我建议使用HTML 5本地存储。它非常快速且易于使用。

您可以在JS中为您的颜色创建对象构造函数,如下所示:

function Color (name, alias, rgbCode) {
    this.name = name;
    this.alias = alias;
    this.rgbCode = rgbCode;
}

每当您想要添加颜色时,请执行以下操作:

var redColor = new Color ("red", "primary", "#FF0000");

要存储它们,请在本地存储中创建密钥。

if (localStorage["colors"] === undefined) {
    localStorage["colors"] = [ ];
}

现在,您可以在该阵列中推送任何颜色。

var local = JSON.parse(localStorage["colors"]);
local.push(redColor);
localStorage["colors"]=JSON.stringify(local);

要访问颜色,您可以

var local = JSON.parse(localStorage["colors"]);
for(i=0; i<local.length; i++){
    console.log("Color Name: " + local[i].name + " Alias: " + local[i].alias + " RGB Code: " + local[i].rgbCode);
}

注意:这一切都是在客户端完成的,因为数据都是静态的。当这样的现代解决方案可用时,增加服务器负载是没有意义的。

希望有所帮助!

答案 1 :(得分:0)

有很多方法可以解决这个问题。一种选择是使用MemoryCacheSystem.Runtime.Caching命名空间)

您可以创建一个检查缓存的方法,如果不存在,则从数据库中获取值并将其添加到缓存中。此方法可以位于单独的存储库类中,也可以位于BaseController类中。例如

using System.Runtime.Caching;

public List<MyColor> FetchColors()
{
  // Check cache
  List<MyColor> colors= Cache.Get("Colours") as List<MyColor>;
  if (colors== null)
  {      
    List<MyColor> colors = // Fetch colors from database
    Cache.Set("Colours", colors); // Add to cache
  }
  return colors;
}

public static object Get(string key)
{
  return MemoryCache.Default[key];
}

public static void Set(string key, object data, int duration = 60)
{
  CacheItemPolicy policy = new CacheItemPolicy();
  policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(duration);
  MemoryCache.Default.Add(new CacheItem(key, data), policy);
}

public static void Invalidate(string key)
{
  MemoryCache.Default.Remove(key);
}

然后在你需要属性的每个控制器中只需调用FetchColors()并在任何修改颜色的方法中,调用Invalidate("Colors");将其从内存中删除并强制从数据库加载数据在接下来的电话会议上。

请注意,所有这些都假设您没有使用网络农场。

答案 2 :(得分:-1)

尝试将数据存储在用户的会话中。然后,当用户更改页面时,它始终可用。

How to use sessions in an ASP.NET MVC 4 application?