【问题标题】:Postback Data is not retained回发数据不保留
【发布时间】:2012-07-02 11:42:39
【问题描述】:

我刚从 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 的那个没有被保留。我在这里做错了吗?

【问题讨论】:

  • 进行回发时,控制器中的 mv.HiddenData 变量是否填充了数据?如果没有,数据当然不会发送到视图。是的,你是正确的,当 mv 包含两个属性的内容时,它们应该显示在视图中。我假设您在 HttpGet 中输入隐藏字段的数据(因为您无法在表单的隐藏字段中输入它..)

标签: .net asp.net-mvc postback


【解决方案1】:

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

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

Razor MVC model is losing data on Save action

ASP.Net MVC Hidden field not working as expected

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

【讨论】:

  • 似乎另一个第三方插件正在使用我使用的相同 ID,因此浏览器感到困惑。感谢您的提醒
【解决方案2】:

如果在mv.DoSomething(); 中修改TextboxData 或HiddenData 属性的值,则这些更改不会在您渲染视图时得到反映。这样做的原因是因为诸如TextBoxFor 和HiddenFor 之类的HTML 助手在绑定时首先查看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);        
}

【讨论】:

  • 我实际上并没有修改 DoSomething 中的回发值。但至少我现在知道您是否需要删除 MOdelState 中的这些值。谢谢
  • +1 这个信息很有用,感谢您的启发。
【解决方案3】:

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

查看this dotnetslackers article上模型绑定如何工作的说明

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

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

希望这会有所帮助!

【讨论】:

  • 我明白了。似乎另一个元素的名称与我使用的 ID 相同。我猜浏览器很混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多