2012-04-02 115 views
2

前幾天,我詢問了this question關於在ASP.NET MVC控制器中調用jquery ajax函數的操作。它現在按照它應有的方式工作,但我遇到了另一個問題,從那時起我一直試圖解決它。ASP.NET MVC在視圖中未顯示更新的模型數據

情景是玩家正在創建一個新角色並獲得免費點數以修改角色狀態(強度,敏捷度和智力)。我使用視圖模型將數據從控制器傳遞到視圖,TempData [「model」]用於在控制器動作之間傳遞模型。在服務器端一切看起來都很好。點擊後,ajax POST請求被髮送到調用ChangeStat方法的服務器,字符統計信息在模型中被修改。然後我重定向到渲染視圖的動作。

我的問題是,顯示在視圖中的數據仍然是相同的(即不根據修改後的模型更新)。我讀過,這是由於MVC驗證,所以HTML助手首先chceck舊值顯示時呈現相同的視圖。我想這是一個很常見的問題,但我無法找到解決方案。我試過使用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"); 
} 

創建方法,這使得該視圖:

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

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

,並鑑於我呈現從模型數據與HTML輔助

<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,然後使用一些客戶端jQuery來設置UI?代碼可以通過在控制器中定義[NonAction]方法來共享。 – BigMike 2012-04-02 09:23:33

回答

1

我同意@BigMike,你應該把一個JsonResult交給視圖。另外,爲了最佳實踐,您應該在調用動作之前驗證條目,這樣,如果不需要,您不會發送ajax請求。因此,如果您在ajax POST之前進行驗證,那麼您可以在ajax POST之前渲染UI更改,並使用void操作更新服務器上的數據。

+0

謝謝你的回答。 – LetThereBeByte 2012-04-02 10:14:48

相關問題