在我的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。
答案 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();
}
});
其中transactions
是ITransactionManager
个实例,在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"});
});