前几天,我询问了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