【问题标题】:How to make an entity update its own field如何让实体更新自己的字段
【发布时间】:2012-10-31 03:04:50
【问题描述】:

如果用户更改了field_2,我想更改field_1 的值。通常,使用 JS 在客户端上执行此操作在这种情况下,用户可能会再次改变主意,回到原来的值。所以,我想更新插件中的一个字段。

我成功地发现了field_2 的变化,但是当我为field_1 赋值时,它并没有存储在数据库中。我做错了什么?

if (IsField_2Changed())
   (Context.InputParameters["Target"] as Entity).Attributes["field_1"] = 666;

我没有崩溃,也没有抱怨但是 666 的值(因为是万圣节)没有存储到数据库中。代码在更新消息上执行。

请注意,用户不会更改field_1。稍后将设置为只读字段。

【问题讨论】:

  • @PeterMajeed 不是真的,彼得。这次不是,嗨。我根本没有收到任何错误。找到了 is 字段(尽管我最近几天找不到东西)。它也被写入。 但是,我粘贴到目标实体中的值不会存储到数据库中。

标签: c# dynamics-crm-2011


【解决方案1】:

这有点猜测,因为您没有提及您的插件是如何注册的。

但是我猜这个插件应该在 Pre 上注册在 Post 上。

如果要使用 Target 进行更新,则需要在 Pre 中进行。

如果您的插件必须在 Post 上,请使用网络服务更新调用。

【讨论】:

  • 使用网络服务更新调用”到底是什么意思?由于我不想将我的插件置于预先状态(担心如果我改变我对何时执行的基本假设,其余代码会做什么)我通过简单地重新更新实体解决了这个问题。当然,必须小心不要引起复发(我知道这是一个事实,一个非常痛苦的事实),但除此之外,它似乎有效。然后我开始想 - 也许詹姆斯有更好的主意,所以我直接问了。
  • “使用网络服务更新调用”是指发出 SOAP 或 REST 请求,例如service.Update(entity)。这可能是您已经在做的事情。如果我正确理解了这一点:“我通过简单地重新更新实体解决了这个问题”。插件重复触发自己只是必须处理的事情,通常通过检查IExecutionContext.Depth属性:msdn.microsoft.com/en-us/library/…
  • 酷。我不知道IExecutionContext.Depth。下次我会试试的。
【解决方案2】:

您可以在 JavaScript 中执行此操作。只需将您的函数添加到 field2 的 OnChange 事件中。它不是 OnBlur 事件,因此只有在用户更改后离开字段时才会触发。

如果您需要在每次用户离开该字段时触发,您也可以通过 JavaScript 绑定到 OnBlur 事件(不与字段 on change 事件绑定),但不支持。

不过,对于插件,这里有一个很好的介绍(尽管逻辑并不完全相同) http://nzcrmguy.blogspot.com/2011/03/updating-fields-on-crm-2011-plugin.html

【讨论】:

  • Naa,JS 在这种情况下不会做。我需要使用插件解决它。我会看看步行,但我怀疑我做对了,只是除了一些小细节。还有 boy 那个博客上的一种草率和丑陋的格式。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多