2009-03-24 78 views
0

ビュー内のいくつかの値に対していくつかの計算を実行したい...ユーザーが入力に値を入力すると、サーバーに戻る必要があります。 ..計算を実行し、新しい値でビューを "リフレッシュ"します。コードが今のように、正しい(...または少なくとも私がそれに尋ねる)コントローラアクションを入力し、正しく更新されたViewDataをビューに返します。私はビューのHTMLを構築するループスルーステップた場合、のViewDataは、更新された値を持っていますが、表示がブラウザ上に表示されている場合、値は...ビューに更新された値が表示されないasp.net mvc

を変更していないここではjavascriptを

$('input.changeValue').change(function() { 
    $('body').css('cursor', 'wait'); 
    var changedAmt = this.value; 
    var frmUpdate = $('form#frmUpdate').serializeArray(); 

    fooSoldObj = new Object(); 
    fooSoldObj.name = 'fooSoldAmt'; 
    fooSoldObj.value = changedAmt; 

    frmUpdate[frmUpdate.length] = fooSoldObj; 

    $.ajax(
      { 
       type: $('form#frmUpdate')[0].method, 
       url: $('form#frmUpdate')[0].action, 
       data: frmUpdate, 
       dataType: 'html', 
       error: function(error) { 
        alert('frmUpdate error' + error); 
       } 
      } 
     ); 

    setTimeout(function() { 
     $('body').css('cursor', 'default'); 
    }, 0); 
}); 
ですここで

フォームfrmUpdateのHTMLだけで、さらに物事を混同し

<form action="/Forecast/Update" id="frmUpdate" method="post" name="frmUpdate"> 
    <span> 
     <input id="HiddenForecastID" name="HiddenForecastID" type="hidden" value="XXX" /> 
     <input id="HiddenForecastYear" name="HiddenForecastYear" type="hidden" value="2009" /> 
     <input id="HiddenForecastMonth" name="HiddenForecastMonth" type="hidden" value="3" />  
    </span> 
</form> 

次のようになります、正しく表示されないデータは、ビュー上の別の形態です。私が2つのフォームを持っている理由(正しいか間違っているか)は、ビュー上の他のフォームが保存ルーチンを開始することです。

はここで多分それは働いていない理由は、私は1つのフォームを更新して、更新するためのMVCのビューエンジンを求めているということであると私は考えてい

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Update(FormCollection frmUpdate)    
    { 
     //go off and do some stuff...this part works as the ViewData 
     //is correct....meaning it has the updated values that 
     //we want to see displayed in the view 
     return View("MyView", ViewData[someData]); 

    } 

コントローラのアクションの関連部分だ/リフレッシュ(ただし、ページを作成するビューのループをステップ実行すると、データは更新されますが、ブラウザのページは表示されません)...ビューで正しいhtmlを表示させるにはどうすればよいですか?

/****************************************
追加次のコードは、ちょうどRedirectToAction
をテストするためのAJAX呼び出しDOES上記リターン・ビュー上のエラーではなく(「何とか」)のもの
******************** *************************/

PSただ、この

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Update(FormCollection frmUpdate)    
    { 
     //go off and do some stuff...this part works as the ViewData 
     //is correct....meaning it has the updated values that 
     //we want to see displayed in the view 
     return RedirectToAction("MyView", new RouteValueDictionary(new { controller = "Forecast", action = "MyView", addMonth = monthAdd })); 
    } 

のようなコントローラにRedirectToActionを試してみましたが、その後500エラー

おかげで、
グレッグ

答えて

3

あなたはほとんどそこにいる。これは私たちのやり方です。

ビューでは、ajaxを使用して更新するセクションについては、ここからhtmlをPartial_View_of_Formと呼ぶ部分ビューにコピーしてビューにレンダリングします。我々は後でこのコンテンツを置き換えることができますので、更新のために...

<div id="replace_me"> 
    <% Html.RenderPartial("Partial_View_of_Form", ViewData[someData]); %> 
</div> 

ユニークなdivの内側にこれを入れて()の代わりにビューを返す、新しい値で先ほど作成した部分ビューを返します:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Update(FormCollection frmUpdate) 
{ 
    // do whatever processing you need here 
    return PartialView("Partial_View_of_Form", ViewData[updatedData])); 
} 

最後に、ajax投稿では、アクションから戻ってきたhtmlを把握し、元の部分表示の内容を置き換えます。

success: function(html) 
{ 
    $("#replace_me").html(html); 
} 

これはかなりラフなコードとテストされていないが、ここでは

+0

それをありがとう...私は間違いなくそれを試みる...それは完璧な意味を作る – w4ik

0

とAJAX呼び出しのエラーは、あなたはここに2つの独立した環境を持っています。 MVCコードはサーバー上で実行され、JavaScriptはクライアント(ブラウザ)上で実行されます。フォームを送信すると、ブラウザはサーバーに要求を返し、コントローラはそれを処理します&は、ビューをレンダリングするためのデータを提供します。レンダリングされたビューはブラウザに返され、ブラウザはそれを解釈する必要があります。

500応答コードは、「サーバーエラー」を意味します。言い換えれば、サーバーはブラウザに応答を送信する前に問題が発生しています。エラーが表示されたら、提供されているエラーの詳細を調べてみてください。それは何がうまくいかないかについての手がかりを与えるはずです。あなたがレンダリングしているビューにはおそらく間違いがあります。私は更新されたデータを表示するビューを得た

+0

から行くのはかなり簡単なはずです。しかし、私はちょうどリターンビュー(「何とか」)のものを使用する場合、私は、エラーを得ることはありません..私はそれを追加してはいけません、それは混乱して質問をします... – w4ik

0

...それは...ここで私は今$アヤックスのJavaScript

$('input.changeValue').change(function() { 
    $('body').css('cursor', 'wait'); 
var changedAmt = this.value; 
var frmUpdate = $('form#frmUpdate').serializeArray(); 

fooSoldObj = new Object(); 
fooSoldObj.name = 'fooSoldAmt'; 
fooSoldObj.value = changedAmt; 

frmUpdate[frmUpdate.length] = fooSoldObj; 

$.ajax(
     { 
      type: $('form#frmUpdate')[0].method, 
      url: $('form#frmUpdate')[0].action, 
      data: frmUpdate, 
      dataType: 'html', 
      /* the line below is the change */ 
      success: function() { window.location = document.location.href; }, 
      error: function(error) { 
       alert('frmUpdate error' + error); 
      } 
     } 
    ); 

setTimeout(function() { 
    $('body').css('cursor', 'default'); 
}, 0); 
}); 

に行われた変更はちょうどajaxyないようにオフデータfrmUpdateを送信しますですサーバー...サーバーは、セッションオブジェクト内のデータをいくつか変更します...取得、Sessionオブジェクトに保存されたデータを格納し...そしてビューは、Sessionオブジェクトに見えるコントローラのアクションを

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult MyView(int monthAdd) 

キックオフ

window.location = document.location.href 

ラインを介してロードされ、ちょうど変更されたデータとビューを返します...私は私の肘に私の肘の周りに行っているようです:)

関連する問題