Orchard CMS - 确定模型在内容项驱动程序中是否有效

时间:2013-01-14 22:42:24

标签: asp.net asp.net-mvc asp.net-mvc-3 orchardcms orchardcms-1.6

在我的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。

1 个答案:

答案 0 :(得分: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();
            }
        });

其中transactionsITransactionManager个实例,在ctor中注入。

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

为了做到这一点(假设您已经安装了控制器),您需要使用处理程序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"});
        });