无法更改 ASP.NET MVC 3 中文本框的值

Posted

技术标签:

【中文标题】无法更改 ASP.NET MVC 3 中文本框的值【英文标题】:Unable to change value of a text box in ASP.NET MVC 3 【发布时间】:2011-10-10 02:42:03 【问题描述】:

我在更改 MVC 3 中文本框的值时遇到问题。

我有一个简单的视图,它由控制器返回并输入到自定义视图模型中。视图上有一个文本框,它绑定到视图模型上的字符串属性。如果我在初始加载时填充此字符串,则文本框值包含字符串的值。但是,如果我随后将表单发回相同的 URL 并更改视图模型字符串值并重新加载视图,则文本框包含发回的值,而不是控制器为视图模型提供的值。

我创建了一个简单的测试项目,以尽可能简单的方式重现问题。

查看型号:http://www.codetunnel.com/content/images/textboxproblem/ViewModel.jpg

控制器:http://www.codetunnel.com/content/images/textboxproblem/Controller.jpg

查看:http://www.codetunnel.com/content/images/textboxproblem/View.jpg

在视图中,我显示视图模型字符串值,并将字符串属性绑定到文本框。

初始加载时一切正常:http://www.codetunnel.com/content/images/textboxproblem/InitialLoadTest.jpg

但是,如果我更改文本框的值,然后按 Enter 以 POST 表单,事情就不会像我预期的那样发生。显示的值是控制器在action方法中设置的值,但是文本框保留了回传的值:

http://www.codetunnel.com/content/images/textboxproblem/POSTTest.jpg

我不确定是什么问题。

【问题讨论】:

(codetunnel.com 上的所有链接现在都已失效,可以使用适当的 CDN 替换它们吗?例如在 imgur.com 上?) 【参考方案1】:

这是(不幸的是)正确的行为。当使用TextBoxFor 或其他数据绑定元素时,创建的元素首先绑定到现有的ModelState,然后再绑定到模型。

解决方法是在你的 [HttpPost] 动作中清除 ModelState,这样 POST 动作返回的 View 中的元素将与模型绑定。在您的 POST 操作中,添加以下内容:

ModelState.Clear();

个人认为设计是不正确的,但是清除 ModelState 会给你带来你期望的行为。

【讨论】:

谢谢你。我不敢相信我没有考虑 ModelState,因为这就是验证在显示值时的工作方式。谢谢辅导员本。 不客气。这只是一件令人费解的事情,因为首先绑定到 ModelState 似乎是倒退的。由于正在传递的模型是开发人员的最新意图,因此您会期望这是第一个。 C'est la vie。 任何关于为什么会这样的见解?我过去经历过这种情况,正如你所说,它是令人困惑的。我只能假设他们这样做是有充分理由的…… 没有线索。我不知道这是有意识的设计决定还是疏忽。【参考方案2】:

这是 MVC 应用程序的预期行为。

当您发布帖子时,它会将值存储在 ModelState 中,并且 html 助手使用该值而不是 Model 值。

如果需要,您可以编写自己的 html 助手或使用标准 html <input/> 来解决此问题。

【讨论】:

以上是关于无法更改 ASP.NET MVC 3 中文本框的值的主要内容,如果未能解决你的问题,请参考以下文章

获取asp.net MVC中下拉列表和文本框值的值

Asp.Net MVC 中 DataAnnotations StringLength 中文本框的 maxlength 属性

从asp.net mvc的部分视图中的文本框中获取值

ASP.NET 验证失败时更改文本框的 css 类

无法从文本框中获取更新的值

在 ASP.NET MVC 3 中,Jquery 令牌输入未填充数据库中的值