如何在Dynamics CRM Online中更新已部署的插件

时间:2013-02-26 21:29:47

标签: dynamics-crm-2011

我是Dynamics CRM Online中的新手,我在更新已部署的插件时遇到问题。我使用Visual Studio 2012作为我的IDE。我部署了一个我需要修改的插件,当我通过VS重新部署它时,CRM中的修改日期是正确的,但更改不存在。这是我的代码..

if (context.InputParameters.Contains("Target") 
  && context.InputParameters["Target"] is Entity)
{
  Entity entity = (Entity)context.InputParameters["Target"];
  if (entity.LogicalName == "lead")
  {
    if (entity.Attributes.Contains("companyname") == true)
    {
      if (entity["firstname"].ToString() != "null")
        firstName = entity["firstname"].ToString();
      else
        firstName = "";

      if (entity["lastname"].ToString() != "null")
        lastName = entity["lastName"].ToString();
      else
        lastName = "";

      entity["companyName"] = "This is a test";
      //entity["companyname"] = firstName + " " + lastName;
    }
    else
      throw new InvalidPluginExecutionException(
        "The company name can only be set by the system.");
  }
}

当我创建一个主管时,公司名称不是“这是一个测试”。我不确定我做错了什么。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

您可以通过以下方式检测公司名称字段是否存在:

if (entity.Attributes.Contains("companyname") == true)

但你写信给另一个人,即:

entity["companyName"] = "This is a test";

该值放在实体中,但由于元数据中没有对应的值,因此不会存储它。将字段名称设置为模式名称,即下限。


如果您遇到其他错误,还需要考虑其他一些事项。

  • 在设置字段值后,您需要在服务上调用 Update 方法。
  • 该字段应具有某种前缀(例如 new_something beep_something )。
  • 此处不适用驼峰套管(架构名称为),因此请转到 alltolowercase

您获得的作为公司名称?你是否被抛出异常?


另外,关于代码质量的一些指示。我重建了逻辑以消除不必要的范围复杂性。我删除了多余的 else 语句并与 true 进行了比较。我还建议您将流程拆分为不同的方法,但我相信您已经完成了这个方法。您可能希望使用辅助方法从字段中获取值。请参阅in this post at my suggestion

if (!context.InputParameters.Contains("Target") ||
  context.InputParameters["Target"] is Entity)
  return;

Entity entity = context.InputParameters["Target"] as Entity;
if (entity.LogicalName != "lead")
  return;
if (!entity.Attributes.Contains("companyname"))
  throw new InvalidPluginExecutionException(
    "The company name can only be set by the system.");

String firstName = String.Empty;
if (entity.Contains("firstname"))
  firstName = entity["firstname"] as String;

String lastName = String.Empty;
if (entity.Contains("lastname"))
  lastName = entity["lastname"] as String;

entity["companyname"] = "This is a test";
//entity["companyname"] = firstName + " " + lastName;

编辑:

如果仍未收到请求的行为,请尝试以下操作。 (我不确定你的专业知识水平如此,如果你觉得我曾经侮辱了你已经尝试过很多次的非常基本的东西,请接受我的道歉。)

技术诀窍。

  1. 发布所有自定义项(我经常这样做非常,以防万一)。
  2. 点击 F5 重新加载。
  3. 登录/注销。
  4. 重新启动IIS(如果是内部部署)。
  5. 取消注册插件,查看行为是否仍然存在。 然后重新注册。
  6. 检查已忘记的工作流程。
  7. 可能存在一些延迟和滞后。有一次,我实际上已经触发了旧版本和新版本的插件,这取决于我是否从设置 Workplace 创建了一条记录。这很奇怪,但几个小时后就解决了。认真。 很奇怪!

    程序化技巧。

    1. 检查是否有其他插件可能忘记停用。
    2. 删除所有潜在客户,并确保插件在创建新插件时触发。
    3. 将文字更改为例如我是一个巨大的驼鹿,只是为了确保改变顺利通过。
    4. 删除所有代码(或将返回放在执行的开头。然后,逐步将其向下移动以检测奇怪的开始时间。
    5. 你所展示的内容应该有效,所以要么你没有提到相关的东西(我们赞赏你当然没有发布100000行代码)或者它是CRM这是关闭(这同样令人讨厌和混乱)。所以,让我们麻烦拍摄这件事。当你尝试上面的技巧时会发生什么?

      关于代码存根,是的 - 我对MS的努力并不感到自豪。尝试在 Programmers 上的标记C#下发布该代码以进行代码审查。为愤怒的讨论做好准备。 :)