【问题标题】:How to detect if form field has changed without using hidden field如何在不使用隐藏字段的情况下检测表单字段是否已更改
【发布时间】:2011-04-26 15:59:50
【问题描述】:

我正在使用 ASP.NET MVC 3,并且需要检测服务器端的表单字段是否已更改。我知道使用隐藏字段的技巧,但我想知道是否有办法只使用 API 来做到这一点?

基本上,我的模型有编辑屏幕,其中一个字段是可以指定的可选 id。如果指定了该字段,我必须确保它是唯一的(没有其他模型具有它)。所以在编辑控制器上,我想运行验证,但前提是该字段已更改。

请注意,我不需要知道以前的值和新的值,只要字段值发生了变化。

【问题讨论】:

  • 我对 MVC 模式不是很熟悉,但我会设置一个 javascript 来捕捉对文本框的更改并使用 AJAX 来检查该 id 是否已经存在。
  • 为什么不每次都运行验证?
  • @hyp js 没问题,但我还需要服务器端解决方案(如上所述)。 MVC3有一个属性@Remote,可以用于AJAX远程验证
  • @jfar 如果该字段包含可选的 id(例如 123)并且尚未更改,那么我不必进行数据库调用。如果它已被更改,那么我会进行数据库调用以查看其他客户是否具有相同的 id(因此,引发模型验证错误)
  • @zam6ak - 在写入期间通过 ID 调用进行额外选择不会伤害您。我会说它是一个简单的权衡,因为你引入了脏跟踪的复杂性。

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


【解决方案1】:

您必须在某处保留旧值的副本,然后进行比较。您可以将其存储在您的视图模型中。

【讨论】:

  • 嗯...没有其他办法吗?我希望 MVC3 API 可能会在字段上设置“脏”标志...
  • 不,你可以使用任何类作为你的模型,它不需要从任何东西或其他继承......所以,如果你想跟踪变化,你必须存储旧的模型中的值,当用户发布表单时,比较这些值。
  • 你建议的是我希望避免的“隐藏字段”/“带有哈希的隐藏字段”方法......但我似乎没有选择......
  • 确实如此。您也可以将整个表单的先前版本存储在 Session 变量中,但这绝对不是最佳实践。最好将旧值存储在视图模型中,标记为隐藏。
【解决方案2】:

确实没有“脏”标志——MVC 实际上更接近“网络工作方式”来重用该语句。发送的所有内容都是名称值对。没有其他的。 MVC 的模型绑定器仅将这些名称与您的对象匹配 - 因此,为了真正检测到更改,您必须在发布时验证真实数据源或比较表单中传入的值 - 在这种情况下 - 最好散列到避免伪造。

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2021-06-20
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多