2012-04-02 113 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

相关问题