5

这一定是很明显的事情,但对我来说它看起来很奇怪。我有简单的控制器、具有一个属性的模型和显示属性值并呈现该属性的编辑器的视图。当我单击按钮时,会发布表单并将感叹号附加到属性。这个感叹号在我看来是可见的,但只在p标签中可见,而不是在inputHtml.TextBoxFor().

为什么Html.TextBoxFor()忽略我在后期操作中更新了我的模型?

有没有办法改变这种行为Html.TextBoxFor()

看法

@model ModelChangeInPostActionNotVisible.Models.IndexModel

@using (Html.BeginForm())
{
    <p>@Model.MyProperty</p>
    @Html.TextBoxFor(m => m.MyProperty)
    <input type="submit" />
}

模型

namespace ModelChangeInPostActionNotVisible.Models
{
    public class IndexModel
    {
        public string MyProperty { get; set; }
    }
}

控制器

namespace ModelChangeInPostActionNotVisible.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new IndexModel { MyProperty = "hi" });
        }

        [HttpPost]
        public ActionResult Index(IndexModel model)
        {
            model.MyProperty += "!";
            return View(model);
        }
    }
}

点击提交按钮后的 HTML

<form action="/" method="post">    <p>hi!</p>
<input id="MyProperty" name="MyProperty" type="text" value="hi" />    <input type="submit" />
</form>
4

2 回答 2

10

这是设计使然。

辅助方法使用 ModelState,因此如果您的请求的响应使用相同的模型,它将显示发布的值。

这是为了允许您在验证失败的情况下呈现相同的视图。

为确保您显示新信息ModelState.Clear();,请在返回之前添加:。

在这里阅读更多:http: //blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net-mvc-s-html-helpers-render-the-wrong-value.aspx

namespace ModelChangeInPostActionNotVisible.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View(new IndexModel { MyProperty = "hi" });
        }

        [HttpPost]
        public ActionResult Index(IndexModel model)
        {
            model.MyProperty += "!";
            ModelState.Clear();
            return View(model);
        }
    }
}
于 2012-11-20T01:52:14.027 回答
6

Yan Brunet 是绝对正确的,该变量需要从 ModelState 中删除才能在控制器中进行修改。不过,您不必清除整个 ModelState。您可以执行以下操作以仅删除要修改的变量:

 ModelState.Remove("MyProperty");

如果您想保留用户输入的其他值,这将很有用。

于 2013-06-13T15:36:48.117 回答