我刚刚离开ASP.NET Web Forms,现在是MVC的新手。 我已经读过MVC不像ASP.NET Web Forms那样管理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的那个。我在这里做错了吗?
答案 0 :(得分:2)
似乎你正在做正确的事情,它应该在发回服务器时发送隐藏的文本数据。
似乎隐藏字段的ID重复或无效。请参考
Razor MVC model is losing data on Save action
ASP.Net MVC Hidden field not working as expected
希望这些帖子可以解决您的问题。
答案 1 :(得分: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);
}
答案 2 :(得分:1)
在POST上,您的模型会自动填写。
查看有关模型绑定如何在this dotnetslackers article
上工作的说明现在问题 - 看看问题中发布的代码,看起来你做得对。要弄清楚这里的问题是你应该做的 1.查看您的页面来源。 2.检查隐藏字段是否使用值(无论您期望的值)呈现
如果渲染的隐藏字段没有设置您希望看到的值,则可能意味着在获取时,创建模型时,“m.HiddenData”未设置正确的值。
希望这会有所帮助!!