2

我刚从 ASP.NET Web 窗体中出来,现在是 MVC 新手。我读过 MVC 不像 ASP.NET Web 窗体那样管理 ViewState。我想知道如何实现数据持久性。

我有一个带有强类型模型的简单表单:

class MyModel
{
    public string TextboxData { get; set; }
    public string HiddenData { get; set; }
}

使用以下形式:

@using (Html.BeginForm())
{
     @Html.TextBoxFor(m => m.TextboxData)
     @Html.HiddenFor(m => m.HiddenData)
}

我的控制器是一个简单的控制器。它只是处理模型中的数据并将其传递回视图:

[HttpPost]
public ActionResult PerformAction(MyModel mv)
{
    mv.DoSomething();
    return View(mv);        
}

由于控制器只是重用模型,我是否正确假设所有通过先前提交输入的数据将在下次刷新时保留?

实际上,保留了 TextboxData 的那个(回发后,文本框仍然包含输入的数据),但没有保留 HiddenData 的那个。我在这里做错了吗?

4

3 回答 3

2

似乎你在做正确的事情,它应该在发回服务器时发送隐藏的文本数据。

似乎隐藏字段的 ID 重复或无效。请参考

Razor MVC 模型正在丢失保存操作的数据

ASP.Net MVC 隐藏字段未按预期工作

希望这些帖子可以解决您的问题。

于 2012-07-02T11:56:03.583 回答
2

如果在内部mv.DoSomething();修改TextboxDataHiddenData属性的值,则在渲染视图时不会反映这些更改。这样做的原因是因为 HTML 助手(如TextBoxForHiddenFor)在绑定时首先查看 ModelState 内部,然后在模型中查看。这是设计使然。

因此,如果您需要修改 POST 操作中最初发布的值,您需要首先将它们从 ModelState 中删除:

[HttpPost]
public ActionResult PerformAction(MyModel mv)
{
    // we intend to modify the values => we must remove them from ModelState
    // or the HTML helpers will reuse the old values
    ModelState.Remove("TextboxData");
    ModelState.Remove("HiddenData");

    mv.TextboxData = "some new value";
    mv.HiddenData = "some new hidden value";

    return View(mv);        
}
于 2012-07-02T13:14:49.567 回答
1

在 POST 上,您的模型会自动填充。

请参阅此 dotnetslackers 文章中有关模型绑定如何工作的说明

现在你的问题 - 查看问题中发布的代码,看起来你做对了。要找出这里的问题是您应该做的 1. 查看页面的源代码。2.检查隐藏字段是否以值呈现(无论您期望什么值)

如果渲染的隐藏字段没有设置您期望看到的值,这可能意味着在获取时,创建模型时,“m.HiddenData”没有设置正确的值。

希望这可以帮助!!

于 2012-07-02T12:54:35.333 回答