2017-03-14 9 views
1

私のASP.Net MVCページには、AJAXフォームがあります。async:falseを使用せずにajaxの挿入を正しい順序で実行できますか?

@using (Ajax.BeginForm("action", "controller", new AjaxOptions { 
     HttpMethod = "POST", 
     InsertionMode = InsertionMode.InsertAfter, 
     UpdateTargetId = "target" 
    })) 
    { 
      //form in here 
      <input name="foo"> 
      //... 
    } 

ユーザーは、データを入力して手動でフォームを送信するか、大量のデータをコピーして一度に送信できます。私はこれを行うには、次のJSを使用します。

jQuery.ajaxSetup({ async: false }); 
var objects = getDataFromClipboard(); 
for (x = 0; x < objects.length; x++) { 
    $('#foo').val(objects[x]); 
    $('#form').submit(); 
} 
jQuery.ajaxSetup({ async: true }); 

問題は、私は、「非同期:false」を使用するように強制していますということで非常に遅いですし、それが働いている間、私のページ全体をフリーズします。私が "async:true"のままにすると、結果は誤った順序で追加されます。

これらのフォームで更新を順番に実行するような方法がありますか?

+1

2つの可能性があります。まず、リクエストをチェーン化します。次に、すべてのデータを1つのリクエストに入れて送信します。後者はここでは最高の選択肢です。 'async:false'を提案する人は無視してください –

+0

@RoryMcCrossan入力を処理しているコントローラ/モデルは、単一の値(文字列)で動作するように設定されています。 1つのリクエストですべてのデータを送信することはできますか、または配列を受け入れる/返すためにそれらを書き直す必要がありますか? –

+1

はい、これらのエンドポイントのモデルを書き直す必要があります。 –

答えて

1

正しい方向に私を指差してくれたRory McCrossanに感謝します。

非常に簡単な解決策は、すべての入力を1つの文字列としてグループ化し、区切り文字で区切ることです。それで、私は単純に1つのリクエストでデータ全体を送信できます。私はこの入力を処理するためにコントローラを書き直すだけでした。

次のように私は私のJSを変更:

var objects = getDataFromClipboard(); 
var foo = objects[0]; 
for (x = 1; x < objects.length; x++) { 
    foo = foo + "|" + objects[x]; 
} 
$('#foo').val(foo); 
$('#form').submit(); 

私のフォームとモデルが変わりませんでした。次のように

@using (Ajax.BeginForm("action", "controller", new AjaxOptions { 
    HttpMethod = "POST", 
    InsertionMode = InsertionMode.InsertAfter, 
    UpdateTargetId = "target" 
})) 
{ 
     //form in here 
     <input name="foo"> 
     //... 
} 

モデル

public class FooModel 
{ 
    public String foo { get; set; } 
} 

フォームは私のコントローラは現在の入力を処理します。

[HttpPost] 
public ActionResult action(ADModel model) 
{ 
    char separator = "|"[0]; 
    if (!String.IsNullOrEmpty(model.foo)) 
    { 
     string[] foos = model.fname.Split(separator); 
     string result = ""; 
     for (int x = 0; x < foos.Length; x++) 
     { 
      result = result + searchData(foo[x]) + "<br>"; 
     } 
     return Content(result, "text/html"); 
    } else { 
     return Content("<i>No results found</i>","text/html"); 
    } 
} 
関連する問題