我有这段代码,我无法理解为什么会这样运作
我有一个模型和视图,它是任意的,非常简单(但很奇怪)的控制器
这是我的控制器:
public partial class RouteController : Controller
{
[HttpGet]
public virtual ActionResult Create()
{
Create create = new Create();
return View("Create", create);
}
[HttpPost]
public virtual ActionResult Create(Create route)
{
return Create();
}
}
第一个create方法正常加载视图。当视图回发时它运行第二个动作,它运行第一个动作(如预期的那样)。奇怪的部分是视图(重新)加载我之前输入的有错误的数据(如果有的话)。我不明白这一点,因为我的模型是空的。我期待它以相同的形式回发,就好像它是第一次加载但可能有错误。
请解释。
答案 0 :(得分:1)
这是HTML帮助程序的正常行为,它是设计使然。他们首先查看ModelState中包含的值,然后查看实际模型中包含的值。如果您打算在POST操作中修改模型上的某些值,则需要先从模型状态中删除它们:
例如:
[HttpPost]
public virtual ActionResult Create(Create route)
{
ModelState.Remove("SomeProperty");
route.SomeProperty = "some new value";
return View(route);
}
如果您打算完全修改示例中的所有内容,则可以完全清除模型状态:
[HttpPost]
public virtual ActionResult Create(Create route)
{
ModelState.Clear();
return Create();
}
另一种可能性是编写自己的TextBoxFor,HiddenFor,CheckBoxFor,...助手,它们将使用模型中的值而不是模型状态中的值。或者另一种(非推荐)可能性:
<input type="text" name="SomeProperty" value="@Model.SomeProperty" />
当然,在这种情况下,标准帮助程序提供的其他内容中的客户端验证将不起作用。