【问题标题】:How to display different values without refreshing the page MVC C#如何在不刷新页面MVC C#的情况下显示不同的值
【发布时间】:2015-12-14 00:02:35
【问题描述】:

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

public static int myValueReader { get; set; }

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

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

【问题讨论】:

  • 如果您这样做是为了显示长期运行任务的进度,请查看 SignalR 的管道。
  • 你的目标是什么? SignalR 是一个选项,但需要努力配置。周期性的 ajax 调用呢?
  • @axlj 我有 8 个不同的对象,我需要它们都同时读取这些值,然后我需要调用一个事件如果显示我要查找的特定值在屏幕上。
  • 你需要AJAXsetTimeout
  • @WKara 我想我的问题是:这些信息需要实时显示给用户吗?或者它可以有几秒钟的延迟?

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


【解决方案1】:

这是另一种方法:

  • 使用 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>

【讨论】:

  • 这如何满足实时性要求?
  • @axlj 请你解释一下为什么它不满足实时要求,因为你现在可能已经明白了,这对我来说是一个全新的东西,所以我看不到有问题吗?
  • @WKara 对我来说,实时意味着事件发生和用户收到通知之间的唯一延迟是由于网络延迟。至少,您看到的延迟至少为 1 秒,或者最差的是 2 秒。这就是为什么我问几秒钟有多重要。不管怎样,我很高兴你找到了一个好的解决方案:-)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2011-06-15
    • 2019-11-25
    相关资源
    最近更新 更多