无法弄清楚为什么MVC“Controller”中的“Action”没有返回大多数当前数据

时间:2013-11-21 05:10:33

标签: c# asp.net-mvc jquery

控制器:

public ActionResult Index() {
    return View();
}

public JsonResult JsonData() {
    return Json(indexModel().Number, JsonRequestBehavior.AllowGet);
}

private IndexModel indexModel() {
    IndexModel model = (IndexModel) Session["IndexModel"];
    if (model == null) {
        model = new IndexModel();
        Session["IndexModel"] = model;
    }
    return model;
}

public void RunNumber() {
    for (int i = 0; i < 25; i++) {
        indexModel().Number = i;
        Thread.Sleep(1000);
    }
}

查看:

function NumberCounter() {
    var interval = window.setInterval(function(){
        $.ajax({
            url: "@Url.Action("JsonData", "Home")",
            dataType: 'json',
        success: function (data) {
            $('#counter').html(data);
            console.log(data);
            if (data == 20) {
                window.clearInterval(interval);
            }
        }
    });
}, 1000);
}


</script>

<div id="counter"></div>

@Ajax.ActionLink("test", "RunNumber", new AjaxOptions { OnBegin = "NumberCounter" }) 

点击“test”链接后我试图让jQuery AJAX在div标签中打印新号码,它每秒向Action(“JsonData”)发送请求,这很好!但它返回的“indexModel()。Number”值为0,而“RunNumber()”方法中的“For循环”仍在运行,一旦“for循环”完成循环,则jQuery Ajax获取“indexModel”的最新值().Number“并打印出来。我甚至试图在控制器中记录“数字” - 没有运气。

如果“indexModel()。Number”中的数字值已更改,如何让它打印新号码?

3 个答案:

答案 0 :(得分:1)

您没有更新Session对象。 试试这样的事情:

public void RunNumber() {
    for (int i = 0; i < 25; i++) {
        var model = indexModel();
        model.Number = i;
        Session["IndexModel"] = model;
        Thread.Sleep(1000);
    }
}

希望有所帮助

答案 1 :(得分:1)

您的数据可能正在缓存中。 尝试将cache:false添加到您的ajax调用中。

function NumberCounter() {
    var interval = window.setInterval(function(){
        $.ajax({
            url: "@Url.Action("JsonData", "Home")",
            dataType: 'json',
            cache: false, 
        success: function (data) {
            $('#counter').html(data);
            console.log(data);
            if (data == 20) {
                window.clearInterval(interval);
            }
        }
    });
}, 1000);
}

答案 2 :(得分:0)

通过将控制器中的计数器功能转换为静态来修复它:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        Static.Number = 0;

        return View();
    }

    public JsonResult JsonData()
    {
        if (Static.Number == 0) Static.RunNumber();

        return Json(Static.Number, JsonRequestBehavior.AllowGet);
    }

}

public static class Static
{
    public static int Number { get; set; }

    public static void RunNumber()
    {
        for (int i = 0; i < 250; i++)
        {
            Number = i;
            Thread.Sleep(1000);
        }
    }
}