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

时间:2011-10-10 02:42:04

标签: c# .net asp.net-mvc asp.net-mvc-3 view

我在更改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

我不确定问题是什么。

2 个答案:

答案 0 :(得分:1)

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

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

ModelState.Clear();

就个人而言,我认为设计不正确,但清除ModelState会给你预期的行为。

答案 1 :(得分:0)

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

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

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