【问题标题】:Razor edit form - is there an attribute or other convenient way to only bind a property if the value has changed?Razor 编辑表单 - 如果值已更改,是否有属性或其他方便的方法仅绑定属性?
【发布时间】:2014-02-22 05:23:17
【问题描述】:

我的一个对象有一个string ImportantName,它必须是唯一的,并且经常用于 URL 路由,例如 http://www.mywebsite.com/objects/{ImportantName}

我可以允许(并且需要允许)更改 ImportantName,但是当我这样做时,我需要执行额外的服务器端验证,并在名称更改时重定向到不同的 URL。

当然我可以添加一些 jQuery 来检测值的变化,或者比较服务器上的旧/新名称,但必须有更好的方法,对吧?

以下任何一项都适合我:

  1. 仅当 ImportantName 根据提供的模型绑定从初始值发生变化时才发送
  2. 添加一个布尔字段以检测ImportantName 是否已更改,并且仅在发生更改时将值发送给服务。

现在我正在通过将OldImportantNameNewImportantName 添加到我的FormModel 并在发布后在服务器上进行比较来解决这个问题。

【问题讨论】:

    标签: jquery asp.net-mvc entity-framework razor custom-attributes


    【解决方案1】:
    • 仅当 ImportName 根据提供的模型绑定从初始值发生更改时才发送它
    • 添加一个布尔字段来检测 ImportName 是否已更改,如果已更改,则仅将值发送给服务。

    如果你想实现上面提到的任何一个选项,你只能在客户端使用 JQuery 来完成它们。我这么说是因为,FORM 已经在客户端浏览器上呈现,并且在 POST 操作中包含/排除任何属性应该通过更改 DOM 在客户端进行管理(如果您不想使用 AJAX,但如果您决定使用 AJAX,那么您只能使用 JQuery 从客户端发布您感兴趣的属性)。事实上,观察模型属性的任何变化也需要在客户端使用 JQuery 完成。

    所以在这种情况下,我更愿意解决这个要求,正是你现在解决它的方式,但几乎没有改变。我没有在 formModel 中包含 OLD/NEW 值,而是只有一个属性 OLD,并且我将使用 JQuery OnChange 识别对它的更改。然后采取必要的行动。如果您不想使用 JQuery,那么在 FORM POST 上,您可以在服务器端使用 ActionFilter 来检查模型的变化(您已经编写了一些代码来检查模型的变化,AFAIK 在 HTTP 世界中没有默认机制识别属性更改)并进行必要的服务器重定向。

    或者,您可以使用 KnockoutJSAngularJs 之类的 JavaScript 框架,它们获得了 Observable 数组或集合,可以用很少的努力来检测客户端的属性更改。然后通过这些框架采取必要的措施并仅发布所需和感兴趣的参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多