【问题标题】:How to perform web service call after updating a content part in Orchard?更新 Orchard 中的内容部分后如何执行 Web 服务调用?
【发布时间】:2013-04-12 09:46:07
【问题描述】:

我有一个 Web API 服务,我已通过使用此处概述的方法将值提取到 ContentPart 中:How to change Orchard record repository

现在,我要做的是更新我的 ContentPart 上的属性值,并通过 Web API 调用执行更新。我想我已经接近了,但就是无法触发更新方法。

在我的Handler 中,我为OnUpdate 添加了一个处理程序。我可以看到我的 OnUpdate 方法已注册,但它从未执行。

所以我的问题是:这是要使用的正确处理程序事件吗?如果是这样,我怎样才能让它触发?

我应该补充一点,我通过Controller 访问ContentPart,而不是Driver

【问题讨论】:

  • 为什么不从控制器操作调用 Web 服务?此外,即使你有一个特殊的控制器,你的部分也应该有一个驱动程序。
  • 我们开始从控制器调用 Web 服务,但随着产品变得越来越大,控制器上的操作开始变得难以阅读/管理。创建部件是抽象访问我们需要的常见项目的工作的一部分。我知道还有其他方法可以做到这一点,但我认为这是一个了解更多关于 Orchard 以及部件如何工作的机会。
  • 当我说从控制器执行时,我并不是说所有逻辑都应该存在:控制器操作应该始终保持精简。我的意思是从操作中启动它们,但将逻辑放在服务类中。

标签: asp.net .net asp.net-mvc web-services orchardcms


【解决方案1】:

OnUpdating / OnUpdated 每当你打电话给IContentManager.UpdateEditor(item) 时都会被解雇。在默认情况下,当您在编辑内容项时点击“保存” 按钮时会发生这种情况。

我不太明白您所说的“通过Controller 访问ContentPart”是什么意思?

您是否有处理项目编辑器呈现和回发的自定义控制器? 或者您是在代码中创建和更新某些项目,而根本不使用内置编辑器?

  • 在前一种情况下,您需要确保 IContentEditor.UpdateEditor(item) 被调用以获取全部内容 POST 操作中的项目(与默认操作相同) 控制器 - Core\Contents\Controllers\AdminController.cs)。
  • 在后者中,我猜这里可能就是这种情况,OnUpdating/ OnUpdated 不会被解雇,你需要调用网络服务 正如 Bertrand 在 cmets 中指出的那样,您自己的控制器动作。

还有第三种选择,我发现它在类似情况下特别有用:

  1. 使用 LazyField<T> 作为更新后需要推送到 Web 服务的部件属性的支持字段。
  2. 将调用 Web 服务的代码放入该惰性字段的设置器中(在处理程序 OnActivated 事件期间设置)。
  3. 现在,只要您的属性得到更新,就会调用 Web 服务,即。惰性字段将充当您的网络服务和当前代码之间的透明代理。

有关如何使用惰性字段的示例,请查看 CommonPartHandler 类和方法 LazyLoadHandlersPropertySetHandlers

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多