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

本文关键字:asp net MVC 文本 ASP 中文 | 更新日期: 2023-09-27 18:11:00

我有一个问题,改变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表单,事情就不会像我预期的那样发生。显示的值是控制器在动作方法中设置的值,但文本框保留返回的值:

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

我不知道是什么问题

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

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

解决方案是清除[HttpPost]操作中的ModelState,这样POST操作返回的View中的元素就会绑定到模型上。在POST操作中,添加以下内容:

ModelState.Clear();

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

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

当你做一个帖子,它存储在ModelState值和Html助手使用该值而不是Model值。

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