3

在我的 Orchard 实例中,我有一个自定义内容类型,其中包含自定义内容部分。在内容部分的“编辑器驱动程序”中,我需要检查容器内容项是否有效(即通过验证)。

由于 Orchard 的工作方式,正常的 ModelState 在这里不起作用——我可以确定内容部分是否有效,但我需要了解整个内容项(内容项中还有其他内容部分)。

我知道一旦使用生命周期事件( http://docs.orchardproject.net/Documentation/Understanding-content-handlers )发布/创建内容部分,就有执行代码的方法,但没有办法(据我所知)传递那些事件信息。

基本上,如果内容项有效,我需要执行一个方法,并且我需要传递 ViewModel 中包含的方法信息。

可能有(并且可能是)更好的方法来做到这一点,但我正在努力在 Orchards 框架内找到一种方法。

示例代码:

//POST
protected override DriverResult Editor(EventPart part, IUpdateModel updater, dynamic shapeHelper)
{
    var viewModal = new EventEditViewModel();

    if (updater.TryUpdateModel(viewModal, Prefix, null, null))
    {
        part.Setting = viewModal.Setting;
    }

    //here's where I need to check if the CONTENT ITEM is valid or not, for example
    if (*valid*)
    {
        DoSomething(viewModal.OtherSetting);
    }

    return Editor(part, shapeHelper);
}

注意:我使用的是 Orchard 1.6 版。

4

1 回答 1

4

恐怕没有简单的方法可以从驱动程序内部做到这一点。太早了。您可以通过 访问其他部分part.As<OtherPart>,但此时可能会或可能不会更新这些部分。

您可以尝试像这样使用处理程序和OnPublishing/ OnPublished(和其他)事件:

        OnPublishing<MyPart>((ctx, part) =>
        {
            // Do some validation checks on other parts
            if (part.As<SomeOtherPart>().SomeSetting == true)
            {
                notifier.Error(T("SomeSetting cannot be true."));
                transactions.Cancel();
            }
        });

实例在哪里,注入到 ctor 中transactionsITransactionManager

如果您需要更多控制,编写自己的控制器来处理项目更新/创建是最好的方法。

为了做到这一点(假设您已经有了控制器),您需要使用处理程序OnGetContentItemMetadata方法来指向 Orchard 以使用您的控制器而不是默认控制器,如下所示:

        OnGetContentItemMetadata<MyPart>((context, part) =>
        {
            // Edit item action
            context.Metadata.EditorRouteValues = new RouteValueDictionary {
            {"Area", "My.Module"},
            {"Controller", "Item"},
            {"Action", "Edit"},
            {"id", context.ContentItem.Id}};

            // Create new item action
            context.Metadata.CreateRouteValues = new RouteValueDictionary {
            {"Area", "My.Module"},
            {"Controller", "Item"},
            {"Action", "Create"});
        });
于 2013-01-15T04:43:11.720 回答