如何在不刷新页面MVC C#的情况下显示不同的值

时间:2015-12-14 00:02:36

标签: c# model-view-controller asynchronous task

我有一个循环遍历值列表的方法,我想要做的是当我打开页面以便能够在不刷新当前视图的情况下看到值的变化。我尝试过类似下面的代码。

public static int myValueReader { get; set; }

public static void ValueGenerator()
{
    foreach (var item in myList)
    {
        myValue = item;
        Thread.Sleep(1000);
    }
}

实际的是,即使我关闭表单,我也希望它读取这些值。我认为我需要分配一个Task才能做到这一点,但是如果有更好的方法,我会徘徊,因为它是一个MVC应用程序?

2 个答案:

答案 0 :(得分:5)

这是另一种方法:

  • 使用AJAX和setTimeout
  • 在您的控制器中声明一个操作(此操作将返回您的不同值)
  • ViewBag中的整数,有些像:ViewBag.totalItems

在控制器中声明操作:这很重要,因为这将是您与数据库或数据的连接。此操作将接收itemIndex并将返回该项。像这样:

[HttpPost]
public JsonResult GetItem(int index) {
    return Json(myList.ElementAt(index));
}

ViewBag.TotalItems :您的视图必须知道列表中有多少项。我建议您通过ViewBag

将该值作为整数传递
public ActionResult Index() {
    ViewBag.TotalItems = myList.Count();
    return View();
}

AJAX和setTimeout :完成所有这些操作后,您就可以更新视图而无需刷新:

<script>
$(function() {
    var totalItems = @Html.Raw(Json.Encode(ViewBag.TotalItems));
    var currentItemIndex = 0;

    var getData = function() {
        $.post("@Url.Action("GetItem")", {index:currentItemIndex}, function(data) {

            // data is myList.ElementAt(index)
            // do something with it

        }).always(function() {
            currentItemIndex++;

            if(currentItemIndex < totalItems) {
                setTimeout(getData, 1000); // get the next item every 1 sec
            }
        })
    }

    getData(); // start updating
})
</script>

答案 1 :(得分:3)

@DavidTansey提到的最好的选择是使用SignlarR。如果用户的浏览器不支持它,它会包装Web套接字并回退到长轮询/等。您的用户将订阅特定频道,然后您可以在这些频道中举办活动。

关于业务逻辑,您需要研究异步编程技术。一旦你开始这个,你可能会有更具体的问题。