前幾天,我詢問了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函數缺少一些邏輯,但現在不是問題。我的觀點是,我需要根據當前的模型數據更新文本框的值(或者完全可以嘗試不同的方法)。
爲什麼沒有一個操作返回一個JsonResult,然後使用一些客戶端jQuery來設置UI?代碼可以通過在控制器中定義[NonAction]方法來共享。 – BigMike 2012-04-02 09:23:33