前几天我问过this question关于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);
}
并在View I中使用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 :(得分:1)
我同意@BigMike,你应该将JsonResult交给View。此外,为了最佳实践,您应该在调用操作之前验证条目,这样您就不会发送ajax请求(如果您不需要)。因此,如果您在ajax POST之前进行验证,那么您可以在ajax POST之前呈现UI更改,并使用void操作来更新服务器上的数据。