2017-04-08 9 views
2

私はイベントのリストを持つ単純なページを持っています。ボタンをクリックすると、参加者ページに移動し、そのイベントで人を読み込む必要があります。page_loadでかなり単純なasp.net非同期操作がUIをブロックしています

ボタンをクリックすると、すべての出席者の処理が完了して終了してから結果が表示されるまで、イベントページは表示されたままになります。最初の非同期呼び出しのイベント名を最初に表示し、ページ上にある進行状況バーには、作成中の出席者のリストを表示できます。出席者ページをクエリ文字列に直接ロードすると、イベント名が表示され、進行状況バーが正常に動作します。

希望の結果を得るためにこれを設定する方法(非同期noob)がわかりませんし、いくつかのポインタをありがとう! events.aspx.csボタンのクリックハンドラで

Response.Redirect("Attendees.aspx?eventID=" + eventID, false); 

その後Attendees.aspx.csをPage_Loadで:

protected void Page_Load(object sender, EventArgs e) 
    { 
     processEvent(); 
     //I've tried this with .Wait() at the end too 
    } 

    private async Task<bool> processEvent() 
    { 
     try 
     { 
      EFEventDetails efEvent = await getEventByIdAsync(); 
      if (efEvent.responseCode != 200) //only 200 is a valid response code for a found event 
      { 
       pnl_loadingError.Visible = true; 
       pnl_attendees.Visible = false; 
      } 
      else 
      { 
       //valid event - carry on. Display event name on page. 
       lbl_EventHeader.Text = efEvent.data.eventID.ToString() + " - " + efEvent.data.eventName; 

       //Now get list of attendees 
       List<vmAttendees> res = await getAttendeesAsync(); 
       if (res.Count > 0) 
       { 
        pnl_AttendeeList.Visible = true; 
        rpt_AttendeeList.DataSource = res; 
        rpt_AttendeeList.DataBind(); 
       } 

      } 

     } 
     catch (Exception ex) 
     { 

      lbl_Result.Text = ex.Message; 
      lbl_Result.ForeColor = System.Drawing.Color.Red; 
      pnl_processResult.Visible = true; 
     } 

     return true; 
    } 

    protected async Task<EFEventDetails> getEventByIdAsync() 
    { 
     var eventsForceService = new EventsForceService(_eventsForceRepo); 
     return await eventsForceService.getEventByIdAsync(_eventID); 
    } 

    protected async Task<List<vmAttendees>> getAttendeesAsync() 
    { 
     var eventsForceService = new EventsForceService(_eventsForceRepo); 
     return await eventsForceService.GetAttendeesByEventIDAsync(_eventID); 
    } 
+0

これは、作業の進行状況バーを取得する方法のあなたの問題を解決していませんが、あなたが読むべき[この記事](HTTPSあなたは 'RegisterAsyncTask(processEvent());'を呼び出す必要があり、あなたのaspxページが 'Async = 'を持っていることを確認するために、' Page_Load'で行うべき正しいことを見るためには://www.hanselman.com/blog/TheMagicOfUsingAsynchronousMethodsInASPNET45PlusAnImportantGotcha.aspx) "true"は 'Page'要素です。)ページがfuになるまで待つだけなら何かを表示する前にロードされています。 –

+0

Scottに感謝します。私のオリジナルの投稿をチェックすると、ページを直接ロードするだけで、すでにプログレスバーの内容がうまく動作していることがわかります。私はそのためにSignalRとイベントハンドラを使用しています。私はあなたが今投稿した記事を読んでいます。ありがとう。 – TheMook

答えて

2

はAPIControllerと負荷を使用しPage_Loadのうち、ロード参加者を取りますページがロードされた後にjQuery Ajaxを使用してデータを取得します。

アンAPIコントローラの例:

public class AttendeesController : ApiController 
{ 
    Attendee[] attendees = new Attendee[] 
    { 
     new Attendee { Id = 1, Name = "Mike" }, 
     new Attendee { Id = 2, Name = "Steve" }, 
     new Attendee{ Id = 3, Name = "Diane" } 
    }; 

    public IEnumerable<Attendee> GetAllAttendees() 
    { 
     // This is using a premade list of Attendees 
     // but you would get them here and return them 

     // Will convert to JSON automatically 
     return attendees; 
    } 
} 

AJAX負荷

<script type="text/javascript"> 
    $.get("Attendees/GetAllAttendees", function(data) { 
     // Load the data into the page after it returns 
     $(".result").html(data); 
     alert("Load was performed."); 
    }); 
</script> 
+0

必要に応じて、私はajaxコールをやってうれしく思いますが、この場合は可能な限り避けようとしています。これは本当に私がやろうとしていることを達成する唯一の方法ですか? C#コードだけでこれを行う方法はありませんか? – TheMook

+0

物事が読み込まれるときに更新される進行状況バーを表示するには、ある種のAJAXが必要です。 –

+3

ページの読み込みはサーバー側で行われます。ページは完了するまで読み込まれません。したがって、データコールがある場合、それは常にそれを待つでしょう。呼び出しを待たずにページをロードするには、ページをクライアントに戻してから、AJAXでデータをロードする必要があります。 –

関連する問題