2011-10-10 88 views
1

我有改变文本框的值在MVC 3无法更改在ASP.NET 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键以岗位作为我所期望的格式的事情不会发生。所显示的值是值的操作方法设置控制器,但文本框保留了被调回的价值:我不知道是什么问题
http://www.codetunnel.com/content/images/textboxproblem/POSTTest.jpg

。任何见解都会被赞赏。

回答

1

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

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

ModelState.Clear(); 

就个人而言,我认为设计是不正确的,但结算的ModelState会给你你所期望的行为。

+0

谢谢你。我不敢相信我没有考虑ModelState,因为这是验证如何显示值时的工作原理。感谢counsellorben。 – Chev

+0

不客气。这只是一件可能会让人迷惑的事情,因为它似乎倒退到首先绑定到ModelState。由于所传递的模型是开发人员最近的意图,所以您会期望这是第一个。这就是生活。 – counsellorben

+0

任何洞察力为什么这是?我在过去经历过这样的事情,正如你所说的,它正在误入歧途。我只能假设他们有一个很好的理由这样做.. – egoodberry

0

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

当您发表的帖子它存储的值在ModelState和HTML辅助使用该值,而不是Model值。

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