ASP.NET MVC更新未在View中显示的模型数据

时间:2012-04-02 09:19:19

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

前几天我问过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函数缺少一些逻辑,但现在不是问题。我的观点是,我需要根据当前模型数据更新文本框值(或者可能完全尝试不同的方法)。

1 个答案:

答案 0 :(得分:1)

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