奇怪的MVC问题

时间:2011-06-11 20:26:58

标签: asp.net-mvc-3

我有这段代码,我无法理解为什么会这样运作

我有一个模型和视图,它是任意的,非常简单(但很奇怪)的控制器

这是我的控制器:

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方法正常加载视图。当视图回发时它运行第二个动作,它运行第一个动作(如预期的那样)。奇怪的部分是视图(重新)加载我之前输入的有错误的数据(如果有的话)。我不明白这一点,因为我的模型是空的。我期待它以相同的形式回发,就好像它是第一次加载但可能有错误。

请解释。

1 个答案:

答案 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" />

当然,在这种情况下,标准帮助程序提供的其他内容中的客户端验证将不起作用。