2012-04-02 20 views
2

数日前、私はthis questionにASP.NET MVCコントローラでアクションを呼び出すjquery ajax関数について質問しました。それは今のところうまく動いていますが、私は別の問題に遭遇し、それ以来それを解決しようとしています。ASP.NET MVC更新されたモデルデータがビューに表示されない

シナリオは、プレイヤーが新しいキャラクターを作成しており、キャラクターのステータス(強さ、敏捷性、知性)を変更するためのフリー・ポイントが与えられているということです。私はコントローラからビューへのデータを渡すビューモデルとコントローラアクション間でモデルを渡すためのTempData ["model"]を使用しています。すべてがサーバー側で大丈夫です。クリックすると、ChangeStatメソッドを呼び出すサーバーにajax POSTリクエストが送信され、文字の統計情報がモデルで変更されます。それから私はビューをレンダリングするアクションにリダイレクトします。

私の問題は、ビューに表示されるデータが同じである(つまり、変更されたモデルに従って更新されない)ということです。私はそれがMVCの検証のためだと読んだので、HTMLヘルパーは、同じビューをレンダリングするときに古い値が表示されることを最初に突き止めます。私はそれがかなり一般的な問題だと思うが、解決策を見つけることができなかった。モデルの代わりにViewDataを使用してみましたが、ViewDataを使用してモデル/モデルを使用して部分的に表示しましたが、結果は表示されません。以下はコードスニペットです。私たちが解決策を見つけることができたら、私のアプローチは間違っているかもしれません。これを解決する方が良い方法があります。

統計情報を変更するためのコントローラのアクション:

[HttpPost] 
public ActionResult ChangeStat(LobbyModels.StatChange stat) 
{ 
    int changeCoef = 0; 
    LobbyModels.CreateCharModel model = (LobbyModels.CreateCharModel)TempData["model"]; 

    if (model.CharFreePts == 0) 
    { 
     return RedirectToAction("Create"); 
    } 

    switch (stat.ActionName) 
    { 
     case "Inc": 
      changeCoef = 1; 
      break; 
     case "Dec": 
      changeCoef = -1; 
      break; 
    } 

    switch (stat.StatName) 
    { 
     case "Str": 
      model.CharStr = model.CharStr + changeCoef; 
      break; 
     case "Agi": 
      model.CharAgi = model.CharAgi + changeCoef; 
      break; 
     case "Int": 
      model.CharInt = model.CharInt + changeCoef; 
      break; 
    } 

    model.CharFreePts = model.CharFreePts + (changeCoef * (-1)); 
    TempData["model"] = model; 

    return RedirectToAction("Create"); 
} 

ビューをレンダリングする方法作成:HTMLヘルパーで

public ActionResult Create() 
{ 
    LobbyModels.CreateCharModel model = LobbyModels.CreateCharModel)TempData["model"]; 
    if (model == null) 
    { 
     // null model handling 
    } 

    TempData["model"] = model; 
    return View(model); 
} 

とビューで、私はモデルからのデータをレンダリングし

<div id="CharStats"> 
    <%= Html.TextBoxFor(m => m.CharStr)%> 
    <input type="button" id="Str_Inc" value="+" /> 
    <input type="button" id="Str_Dec" value="-" /> 
    <%= Html.TextBoxFor(m => m.CharAgi)%> 
    <input type="button" id="Agi_Inc" value="+" /> 
    <input type="button" id="Agi_Dec" value="-" /> 
    <%= Html.TextBoxFor(m => m.CharInt)%> 
    <input type="button" id="Int_Inc" value="+" /> 
    <input type="button" id="Int_Dec" value="-" /> 
    <br /> 
    <%= Html.TextBoxFor(m => m.CharFreePts)%> 
</div> 

ChangeStat関数がいくつかのロジックを欠いていますが、それは今のところ問題ではありません。私の主張は、現在のモデルデータに基づいてテキストボックスの値を更新する必要があるということです(あるいは、別のアプローチを完全に試してみてください)。

+0

なぜJsonResultを返すアクションがないのですか?UIを設定するためにクライアントサイドのjQueryを使用するのはなぜですか?コントローラ内に[NonAction]メソッドを定義することにより、コードを共有することができます。 – BigMike

答えて

1

@BigMikeに同意すると、JsonResultをビューに戻す必要があります。また、ベストプラクティスのために、アクションの呼び出しの前にエントリを検証する必要があります。そうしないと、ajaxリクエストを送信しないことになります。したがって、ajax POSTの前に検証する場合は、ajax POSTの前にUIをレンダリングし、voidアクションを使用してサーバー上のデータを更新できます。

+0

お返事ありがとうございます。 – LetThereBeByte

関連する問題