簡體   English   中英

刷新ASP.NET Core 6寫的一個網頁

[英]Refresh a webpage written in ASP.NET Core 6

我正在尋找幾個小時,但找不到解決我的問題的方法。 我在 c# 使用 WinForms 和 WPF 做了很多“愛好”項目。現在我想用 asp.net 開始一個簡單的網站。

在 VS 2022 中我開始了一個新項目ASP.NET Core-Web-App

我有一個提交按鈕,與此同時,我已經設法從 FTP 服務器加載圖像並在我按下此按鈕時顯示它。

但是,我想在不按下按鈕的情況下定期從服務器加載和顯示不同的圖像。 為此,我內置了一個計時器,可以一遍又一遍地重新加載圖像。

然后我將此圖像分配給我在 Index.chtml 中的圖像,但不幸的是頁面或圖像沒有更新。

我的 index.chtml 看起來像:

@page
    @model IndexModel
    @{
        ViewData["Title"] = "Home page";
    }

    <div class="text-center">
        <h1 class="display-4">Welcome</h1>
        <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
        <p>@Model.Test</p>
        <form method="post">
            <label for="@Model.Test" id="LblTest" runat="server"/>
            <input type="text" id="txtName" name="name" width="300" value="@Model.Test"/>
            <input type="submit" id="btnSubmit" value="Get Current Time" asp-page-handler="Submit"/>
            <br />
            <p><img src="@Model.imageSrc" alt="InfoImage" width="800" border="0" /></p>>
        </form>
    }
    </div>

我的代碼是:

public class IndexModel : PageModel
{
      System.Timers.Timer ReloadTimer = new System.Timers.Timer(10000);

      public IndexModel(ILogger<IndexModel> logger)
      {
          _logger = logger;
      }

      public void OnGet()
      {
          ReloadTimer.Elapsed += ReloadTimer_Elapsed;
          ReloadTimer.Enabled = true;
      }

      private void ReloadTimer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
      {
          ReloadTimer.Interval = 60000;
          Infoanzeige();
      }

      public void OnPostSubmit(string name)
      {
          Infoanzeige();
      }

      public void Infoanzeige()
      {
          //Code to get new image from FTP
      }
}

按下按鈕后,頁面刷新並顯示圖像。 但是當計時器結束時,它運行相同的代碼,但我只看到舊圖像。 我已閱讀有關使用 StateHasChanged 的內容,但此命令在我的上下文中不存在。 (??)

如果有解決方案,我將不勝感激。

JHBonarius 說得對,你不能根據需要從服務器更新頁面,你需要使用 ajax 等技術,使用 javascript

在本例中為 jQuery

<script type="text/javascript">  

function InvokeAction(param){
    $.ajax({
        type: "GET",
        async: true,
        data: param.data,
        url: param.url,
        success: function(response){
            // replace image with response.image
        },
        error: function (jqXHR, exception) {
            console.log('error')
        }
    })
}

$(function () {  
    setInterval(InvokeAction, 60000)
});  

非常感謝您的所有幫助。 我將答案的代碼標記為解決方案,因為它是功能性的。 盡管如此,我還是為我找到了另一個解決方案。 我開始了一個新項目 blazor 服務器應用程序。 有了這個,我能夠毫無問題地將我的 C# 代碼直接集成到網站的代碼中。 在我的代碼中,我最終調用了“InvokeAsync(() => StateHasChanged());”,因此更改將在客戶端呈現。

<img src="@ImageSrc" height="650" style="border:1px solid black;"/>

@code
{
    string ImageSrc = "";
    System.Timers.Timer TimerReload = new System.Timers.Timer();

    protected override void OnInitialized()
    {
        TimerReload.Interval = 10000;
        TimerReload.Elapsed += TimerReload_Elapsed;
        TimerReload.Start();

        InfoseiteLaden();
    }

    private void TimerReload_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
    {
        InfoseiteLaden();
    }

    private void InfoseiteLaden()
    {
        //Code to get new image from FTP

        InvokeAsync(() => StateHasChanged() );
    }
}
´´´

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM