在Asp.Net MVC 3中存储和更新处于应用程序状态的2d阵列

时间:2012-03-06 20:20:34

标签: json asp.net-mvc-3 jquery application-state

我打算根据ajax请求创建一个简单的浏览器游戏。我有一个由客户端上的10x10 div组成的地图。在服务器上我有一个数组[10,10]代表我的div的状态,所以例如如果客户端点击某个div,则在后台发送ajax请求更新我的数组并在数组中插入数字1正确的阵列位置。基于这个想法,我希望所有客户端看到相同的映射,所以我在考虑将我的map数组存储在应用程序状态中(除非有更好的方法),因为我们都知道应用程序状态在所有客户端之间共享。所以我的问题是如何做到这一点,或者我如何实际进入Asp.Net MVC中的应用程序状态。我搜索了很多,在Asp.Net MVC 3中找不到在应用程序状态下插入数据的正确方法,尤其是二维数组,这让事情变得有点困难。到目前为止,我的代码或多或少地使用了应用程序状态。我的意思是每次我创建地图数组的新实例并将该实例从服务器返回到客户端是错误的,因为我只想实例化一个地图并将相同的地图返回给每个人,这就是我正在堆叠的部分。

//当用户访问我的网站时

 public class HomeController : Controller
{

    public MapModel mapModel = new MapModel();

    public ActionResult Index()
    {

        return View(mapModel);
    }

}

//用户点击div(地图图块)时的Ajax请求

$(".mapTile").click(function () {
        var xx = $(this).attr("y");
        var yy = $(this).attr("x");

        $("#info").text($(this).attr("x"));
        var tile = {
            X: xx,
            Y: yy,
            Value: 1
        };

        $.ajax({
            beforeSend: function () { ShowAjaxLoader(); },
            url: "/Game/ShowTiles",
            type: "POST",
            contentType: "application/json;charset=utf-8",
            dataType: "json",
            data: JSON.stringify(tile),
            success: function (data) {
                HideAjaxLoader(), $.each(data, function (index, item) {
                    if (item.Value === 1) {                       
                        var xCordinate = item.X;
                        var yCordinate = item.Y;
                        $("#" + yCordinate + xCordinate).css("background-color", "red");
                    }
                });
            },
            error: function () { showErrorMsg(); }
        });
    });

//我的模特

//地图模型

public class MapModel
{

    private TileModel[,] mapTilesArray;

    public TileModel[,] MapTilesArray
    {
        get
        {
            return mapTilesArray;
        }
        set
        {
            mapTilesArray = value;
        }

    }
    public MapModel()
    {
        MapTilesArray = new TileModel[10,10];
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                MapTilesArray[i, j] = new TileModel();
            }
        }
    }

}

//平铺模型

public class TileModel
    {
        public int X{ get; set; }
        public int Y{ get; set; }
        public int Value { get; set; }

    }

//我的游戏控制器

 [HttpPost]
    public JsonResult ShowTiles(TileModel tile)
    {
        MapModel map = new MapModel();
        map.MapTilesArray[tile.X, tile.Y].Value = 1;
        map.MapTilesArray[tile.X, tile.Y].X = tile.X;
        map.MapTilesArray[tile.X, tile.Y].Y = tile.Y;

        return Json(map.MapTilesArray);
    }

1 个答案:

答案 0 :(得分:1)

将MapModel变量设为静态。它将持续存在于不同的请求中,您将能够向所有用户共享相同的信息。

更改此行

public MapModel mapModel = new MapModel();

用这个

private static MapModel mapModel = new MapModel();

并且不会返回包含每个ajax请求的新地图,只需返回静态变量。