【问题标题】:HTML.TextBoxFor is set readonly before value setHTML.TextBoxFor 在值设置之前设置为只读
【发布时间】:2015-04-24 17:41:10
【问题描述】:

我有以下 HTML 帮助文本框:

@Html.TextBoxFor(m => m.Email, Model.Active ? new { @readonly = "readonly", @style = "background:#E8E8E8" } : new Object { })

当我更改操作中的电子邮件值(在返回的模型中)然后将active=true(也在模型中)设置为只读时,电子邮件文本框值不会使用来自的新值更新模型,我检查以确认模型将返回新电子邮件并且 active=1。

就好像在渲染模型的值之前设置了只读。

感谢您的帮助,谢谢

【问题讨论】:

  • 您能否解释一下下面的句子:“当我在控制器中更改电子邮件值然后设置 active=true 使其只读时,新的电子邮件文本值不会更新。” ?您还可以为我们提供操作实施吗?
  • 在操作中对不起不是控制器,在操作中我检查用户是否处于活动状态,如果他是我忽略电子邮件更新并在模型中发回旧电子邮件和活动 =是的,我预计会用旧电子邮件更新邮箱(基本上忽略用户输入的内容)并使其只读。但是,如果用户仍然不活跃,我允许进行电子邮件更新,并且电子邮件框仍然是可编辑的。
  • Html 助手使用模型状态值来绑定(不是模型值)。您不能只更改模型值并期望它更新(您需要在返回视图之前清除模型状态)但无论如何这是错误的方法 - 您应该遵循 PRG 模式。对于这种行为的解释,refer this answer
  • 谢谢,我会研究一下你所说的这个 PRG 模式
  • 是的,我做错了,您的建议是正确的,如果您想将其作为答案而不是评论,请将其作为答案。

标签: asp.net-mvc html-helper readonly html.textboxfor


【解决方案1】:

当您回发模型时,其值将添加到 ModelState。 Html 助手绑定到ModelState 中的值,而不是模型属性的值,因此在 POST 方法中修改模型属性的值不会反映在视图中,除非您在设置值之前先清除模型状态使用

ModelState.Clear(); // clears all properties

if (ModelState.ContainsKey("active"))
{
    ModelState["active"].Errors.Clear(); //clears the property 'active'
}

this answer 的第二部分解释了这种行为的原因。

但是,清除ModelState 时应谨慎使用,因为它也会清除验证错误,并且无论如何正确的方法是遵循PRG 模式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2019-09-11
    • 2016-09-05
    相关资源
    最近更新 更多