【问题标题】:ASP.NET MVC Updated model data not showing in View [duplicate]ASP.NET MVC 更新的模型数据未显示在视图中 [重复]
【发布时间】:2012-04-15 22:57:51
【问题描述】:

几天前,我向this question 询问了有关在 ASP.NET MVC 控制器中调用操作的 jquery ajax 函数。它现在按预期的方式工作,但我遇到了另一个问题,从那时起我一直在尝试解决它。​​

场景是玩家正在创建一个新角色并获得免费积分来修改角色统计数据(力量、敏捷和智力)。我正在使用视图模型将数据从控制器传递到视图,并使用 TempData["model"] 在控制器操作之间传递模型。服务器端一切正常。单击时,将 ajax POST 请求发送到调用 ChangeStat 方法的服务器,在模型中修改字符统计信息。然后我重定向到呈现视图的操作。

我的问题是视图中显示的数据仍然相同(即未根据修改后的模型更新)。我已经读到这是由于 MVC 验证,因此 HTML 帮助程序在呈现相同视图时首先检查要显示的旧值。我想这是一个很常见的问题,但我无法找到解决方案。我尝试使用 ViewData 而不是模型,使用模型/使用 ViewData 的部分视图但没有结果。下面是代码sn-ps。希望我们能找到解决方案,或者我的方法可能是错误的,并且有更好的做法来解决这个问题。

用于更改统计数据的控制器操作:

[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] 方法来共享。

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-2 asp.net-ajax


【解决方案1】:

我同意@BigMike,您应该将 JsonResult 交给视图。此外,作为最佳实践,您应该在调用操作之前验证条目,这样您就不必发送 ajax 请求。因此,如果您在 ajax POST 之前进行验证,那么您可以在 ajax POST 之前呈现 UI 更改并使用 void 操作来更新服务器上的数据。

【讨论】:

  • 感谢两位的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多