2017-07-06 9 views
0

私はこれまでにJavaScriptを初めて使っています。したがって、問題はより大きなアプリケーションにあります。コントローラは、特定のJavaScript関数が特定のViewModelプロパティに依存するビューに情報リストを渡しています。私はうまくいけば私が得ているものを説明するために簡単なアプリケーションを書いた。以下はJavaScriptを使用してボタンのクリックに関する現在の情報を更新または取得する

は、インデックスページにリストを渡していたサンプルコントローラです:

public ActionResult Index() { 
     List<int> activeIds = new List<int>(); 
     SqlConnection sqlConn = new SqlConnection(connection_String); 

     sqlConn.Open(); 

     string sqlStr = "SELECT * FROM dbo.[JS-Test] WHERE Active = 1"; 
     SqlCommand sqlCmd = new SqlCommand(sqlStr, sqlConn); 
     SqlDataReader sqlDR = sqlCmd.ExecuteReader(); 

     if(sqlDR.HasRows) { 
      while (sqlDR.Read()) { 
       activeIds.Add((int)sqlDR["ID"]); 
      } 
     } 

     sqlDR.Close(); 
     sqlCmd.Dispose(); 
     sqlConn.Close(); 

     return View(activeIds); 
    } 

これは、データベース内の現在の「アクティブ」の項目を返します。

ボタンをクリックすると、データベースから現在アクティブな項目数が取得されています。ユーザーが数分間読み込まれた後、ページ上でアイドル状態を維持しているとします。彼らのページが最初にロードされたとき、モデルはアクティブとしてリストされた5つのアイテムを返しました...しかし、彼らが待っていた間に、データベース内の3つの追加のアイテムが合計で8にアクティブに切り替えられました。現在の8個の代わりに5個のアイテムを提出します。

"/ Home/PostResults" ActionResultでアクティブなアイテムの現在の数を取得するクエリを実行することができません。セットアップ。関数の残りの部分がリフレッシュされたモデルの値を使用する前に、ページをリフレッシュする方法(更新されたモデルを取得する方法)はありますか?

ご不明な点がございましたら、お知らせください。私は喜んで遵守します。私は他の質問や答えを見てきましたが、私の状況ではうまく動作しないものは見つかりませんでした。ありがとう!


編集#1

だから、私はちょうどJSONとしてリスト数を返すホームコントローラにこの機能を追加しました。

public ActionResult GetIds(){ 
     List<int> activeIds = new List<int>(); 
     SqlConnection sqlConn = new SqlConnection(connection_String); 

     sqlConn.Open(); 

     string sqlStr = "SELECT * FROM dbo.[JS-Test] WHERE Active = 1"; 
     SqlCommand sqlCmd = new SqlCommand(sqlStr, sqlConn); 
     SqlDataReader sqlDR = sqlCmd.ExecuteReader(); 

     if (sqlDR.HasRows) { 
      while (sqlDR.Read()) { 
       activeIds.Add((int)sqlDR["ID"]); 
      } 
     } 

     sqlDR.Close(); 
     sqlCmd.Dispose(); 
     sqlConn.Close(); 

     return Json(activeIds.Count()); 
    } 

ビュースクリプトは次のようになります...

<script> 
$(document).ready(function() { 
    $('#printBtn').click(function() { 

     var numberOfActiveIds = @Model.Count(); 

     $.ajax({ 
      type: "GET", 
      url: "/Home/GetIds", 
      success: function(response) { 
       numberOfActiveIds = response; 

       $.ajax({ 
        type: "POST", 
        url: "/Home/PostResults", 
        data: { ids: numberOfActiveIds}, 
        success: function (results) { 
         if(results == "Success") { 
          window.location.href = '/Home/Results'; 
         } 
        } 
       }); 
      } 
     }); 
    }); 
}); 
</script> 
私は現在、次のエラーを取得しています

...

がリソースをロードに失敗しました

:サーバーが応答してステータス500(内部サーバーエラー)


編集#2

JsonRequestBehaviorをAllowGetに設定して正常に動作させる必要がありました。もう一度、ありがとう!私はあなたのアイデアを与えることができ

+0

「ページを更新する方法はありますか?」確かにそれはあなたがしたいことをしません。ページを更新すると、POSTはキャンセルされます。 ajax呼び出しで現在の "actives"を得ることができるように、あなたのコントローラにメソッドを公開できませんか? – gforce301

+0

@ gforce301私はそれを試しましたが、私はそれを正しく設定しているとは思わないし、それが良い練習か可能かどうかは分かりませんでした。もしそうなら、それは最善のルートだと私は思う。私はそれをもう一度設定し、構文やフローのエラーが明白であるかどうかを確認するために書いたものを投稿しようとすることができますか?レスポンスありがとう! – gonzzz

+0

なぜAJAXを使用しますか? AJAXは**非同期**リクエストに使用されますが、 'success'イベントハンドラでは** synchronous **を使用して別のページにリダイレクトします。 – Alexander

答えて

1

gforce301をGETして言及現在のアクテイブは、ajaxコールを介して追加のsepデータベースへのクエリを作成し、返された "actives"を投稿します。それは可能ですか?

はい可能です。それが私がそれを言及した理由です。彼らはあなたがはこれを行うべきだと思いますどのように他の人々の意見の関わらず、私はあなたがそうでない場合でも、それを自分の道を行うことができない理由に制限することができることを理解しています。

以下のコードは、コードの再構成です。 2つのajax呼び出しを連鎖させ、2番目の呼び出しは最初の呼び出しの成功に依存します。最初のajax呼び出しの成功ハンドラのコメントブロックに注目してください。私はその返答が何であるか分からないので、それをどのように使用するのかを記入することはできません。これにより、ユーザーに1回のボタンクリックだけをさせるというあなたの目標が達成されます。

<script> 
$(document).ready(function() { 
    $('#printBtn').click(function() { 

     var numberOfActiveIds = @Model.Count(); 

     $.ajax({ 
      type: 'GET', 
      url: '/path/to/get/activeIds', 
      success: function(response) { 
       /* 
        Since I don't know the structure of response 
        I have to just explain. 

        use response to populate numberOfActiveIds 

        now we just make our post ajax request. 
       */ 

       $.ajax({ 
        type: "POST", 
        url: "/Home/PostResults", 
        data: { ids: numberOfActiveIds}, 
        success: function (results) { 
         if(results == "Success") { 
          window.location.href = '/Home/Results'; 
         } 
        } 
       }); 
      } 
     }); 


    }); 
}); 
</script> 
+0

私は上記の記事を編集して、 。これはまさに私が探しているものですが、現時点ではうまく機能していません。 – gonzzz

+1

ステータス500はサーバーエラーです。あなたはそれを追跡し、何が間違っているかを知る必要があります。 – gforce301

+0

JsonRequestBehaviorをAllowGetに設定する必要がありました。再度、感謝します! – gonzzz

0

レコード数は現在、次に大きい場合、私はそれに役立つことを願って、

は、ビューを更新し、再びデータ(またはDATAT数)を取得するためにbtnclick上の別のAjaxの第一を実行しますそしてPostResultsないと同じことが、その後ちょうどアヤックス成功に

をPostResults場合は、データまたはビュー をリロードすることができますし、失敗(ときなし新しいレコードを)上だけPostResultsを行う

+0

私はそのアプローチについて考えましたが、時代遅れのモデルがあった場合に2回クリックするのではなく、1回のボタンクリックですべてを完了させるのが理想的です。 あなたが言ったことは、私は再びデータ数を取得し、それをPostResultに渡すためにJavaScript関数に渡すことができる方法はありますか?それが私が直接探しているものです。入力いただきありがとうございます! – gonzzz

+0

もう1つの方法は、ある時間間隔の後にajaxをリロードすることです。 –

+0

クリックするか、timeinterval(30秒など)ごとにajaxを実行してカウントを取得してカウントを更新し、btnをクリックするとPostResultsは最後のカウントを取得します。 しかし、これは良い解決策ではありません。なぜなら、間隔とPostResultsの間の時間が新しいアクティブなレコードの同じ問題を再び持つことができるからです。 –

関連する問題