我在更改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
我不确定问题是什么。
答案 0 :(得分:1)
那是(不幸的)正确的行为。使用TextBoxFor
或其他数据绑定元素时,创建的元素首先绑定到现有的ModelState
,然后才绑定到模型。
解决方案是清除[HttpPost]操作中的ModelState,以便POST操作返回的View中的元素将绑定到模型。在POST操作中,添加以下内容:
ModelState.Clear();
就个人而言,我认为设计不正确,但清除ModelState会给你预期的行为。
答案 1 :(得分:0)
这是MVC应用程序的预期行为。
当您发布帖子时,它会将值存储在ModelState
中,而Html助手会使用该值而不是Model
值。
如果需要,您可以编写自己的html帮助程序或使用标准html <input/>
来解决此问题。