Events Sitecore 7:在自定义保存处理程序上发布失败

Events Sitecore 7:在自定义保存处理程序上发布失败,events,save,sitecore,publish,Events,Save,Sitecore,Publish,我正在尝试验证两个日期字段,使开始日期在项上的结束日期之前:保存事件,下面是相同的代码 if(!string.IsNullOrEmpty(eventTemplate)和&!string.IsNullOrEmpty(eventdate)和&!string.IsNullOrEmpty(eventenddate)) { //Validate iItem基于事件模板,然后仅执行检查 var validitem=(来自item.Template.BaseTemplates中的temp 其中temp.ID=

我正在尝试验证两个日期字段,使开始日期在项上的结束日期之前:保存事件,下面是相同的代码

if(!string.IsNullOrEmpty(eventTemplate)和&!string.IsNullOrEmpty(eventdate)和&!string.IsNullOrEmpty(eventenddate))
{
//Validate iItem基于事件模板,然后仅执行检查
var validitem=(来自item.Template.BaseTemplates中的temp
其中temp.ID==新Sitecore.Data.ID(eventTemplate)
选择temp.FirstOrDefault();
if(validitem!=null)
{
字符串firstFieldName=eventdate;
字符串lastFieldName=eventenddate;
Sitecore.Data.Fields.DateField first=item.Fields[firstFieldName];
Sitecore.Data.Fields.DateField last=item.Fields[lastFieldName];
如果(last!=null&&last.DateTime!=DateTime.MinValue&&DateTime.Compare(first.DateTime,last.DateTime)>0)
{
string firstTitle=Sitecore.StringUtil.GetString(first.InnerField.Title,first.InnerField.Name);
string lastTitle=Sitecore.StringUtil.GetString(last.InnerField.Title,last.InnerField.Name);
如果(!string.IsNullOrEmpty(firstTitle)和&!string.IsNullOrEmpty(lastTitle))
{
Sitecore.Web.UI.Sheer.SheerResponse.Alert(String.Format(“未保存为{0}的项应在{1}之前或等于{1}.”,firstTitle,lastTitle));
}
eventArgs.Result.Cancel=true;
}
}
} 
上面的代码很好用。但是在发布网站时,我得到了以下问题:

    Job started: Publish to 'web'|#Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Sitecore.Web.UI.Sheer.ClientPage..ctor()
   at Sitecore.Context.get_ClientPage()
   at custom.ui.extensions.**ValidateDate.OnItemSaving**(Object sender, EventArgs args) in c:\Instance\source\ui\adiweb.ui.extensions\Custom Validations\ValidateDate.cs:line 46
   at Sitecore.Events.Event.EventSubscribers.RaiseEvent(String eventName, Object[] parameters, EventResult result)
   at Sitecore.Events.Event.RaiseEvent(String eventName, Object[] parameters)
   at Sitecore.Events.Event.DataEngine_ItemSaving(Object sender, ExecutingEventArgs`1 e)
   at System.EventHandler`1.Invoke(Object sender, TEventArgs e)
   at Sitecore.Data.Engines.EngineCommand`2.CanExecute()
   at Sitecore.Data.Engines.EngineCommand`2.Execute()
   at Sitecore.Data.Engines.DataEngine.SaveItem(Item item)
   at Sitecore.Data.Managers.ItemProvider.SaveItem(Item item)
   at Sitecore.Data.Items.ItemEditing.AcceptChanges(Boolean updateStatistics, Boolean silent)
   at Sitecore.Data.Items.EditContext.Dispose()
   at Sitecore.Publishing.PublishHelper.CopyToTarget(Item sourceVersion)
   at Sitecore.Publishing.PublishHelper.PublishVersionToTarget(Item sourceVersion, Item targetItem, Boolean targetCreated)
   at Sitecore.Publishing.Pipelines.PublishItem.PerformAction.ExecuteAction(PublishItemContext context)
   at Sitecore.Publishing.Pipelines.PublishItem.PerformAction.Process(PublishItemContext context)
   at (Object , Object[] )
   at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
   at Sitecore.Publishing.Pipelines.PublishItem.PublishItemPipeline.Run(PublishItemContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.ProcessEntries(IEnumerable`1 entries, PublishContext context)
   at Sitecore.Publishing.Pipelines.Publish.ProcessQueue.Process(PublishContext context)
   at (Object , Object[] )
   at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
   at Sitecore.Publishing.Pipelines.Publish.PublishPipeline.Run(PublishContext context)
   at Sitecore.Publishing.Publisher.Publish()
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at (Object , Object[] )
   at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
   at Sitecore.Jobs.Job.ThreadEntry(Object state)
我不知道我为什么会遇到这个问题

此处错误指向该行:

 Sitecore.Web.UI.Sheer.SheerResponse.Alert(String.Format("Item not saved as {0} should be before or equal to {1}.", firstTitle, lastTitle));

使用Sitecore.Web.UI.Sheer.SheerResponse.Alert是无效的,但我看到许多这样的实现。

您在这里犯了一个典型的错误。发布时将触发item:事件,例如item:saved和item:Saveing。基本上是因为发布项目的行为意味着读取项目,并在正常情况下将其保存到“web”数据库中

您可以实现的最快修复方法是确保您正在处理项:将项保存到您期望的数据库中,可能是“master”。比如:

if (validitem != null && validItem.Database.Name == "master")

一个更长期的修复方法是将代码挂接到“saveUI”管道中——它会触发您在这里期望的结果;在UI中保存项目时。

由于发布期间也会运行
项目:保存
事件,因此应在事件处理程序的开头添加对
Sitecore.Context.ClientPage
的空检查,如果为空,请立即返回。这可能是
NullReferenceException
的来源

if (Sitecore.Context.ClientPage == null) return;