无法更改 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 中 DataAnnotations StringLength 中文本框的 maxlength 属性