控制器:
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”中的数字值已更改,如何让它打印新号码?
答案 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);
}
}
}