Событие обновления элемента Sharepoint - отменить событие обратно на страницу редактирования?

У меня есть приемник событий для типа контента, чтобы проверить некоторые данные в событии ItemUpdating. Если я отменяю событие (например, некоторые данные недействительны), я устанавливаю для свойства cancel значение true:

properties.Cancel = true;
properties.ErrorMessage = "...";

SharePoint отменяет событие обновления нормально, но отображает стандартную страницу ошибки SharePoint (с указанным сообщением). Единственная проблема в том, что у меня есть жалоба на то, что это на самом деле не очень полезно - мы должны вернуться на страницу EditForm, чтобы можно было обновить детали.

Кто-нибудь делал это, есть простой способ? Единственное, что у меня было, это то, что я могу реализовать свою собственную страницу с ошибкой, но это звучит довольно тяжелое решение для (теоретически) простого процесса.


person marcus.greasly    schedule 12.01.2010    source источник
comment
На самом деле, у меня просто возникла мысль - я мог бы включить обратную ссылку на страницу редактирования в свое сообщение об ошибке - таким образом, по крайней мере, пользователь мог бы легко вернуться на страницу. Не уверен, возможно ли это, но я попробую, так как это может быть быстрое (и, по общему признанию, немного дерьмовое) решение.   -  person marcus.greasly    schedule 12.01.2010


Ответы (2)


Вы можете попробовать вывести HTML-код (который также включает javascript) в ErrorMessage. НО, даже если вы это сделаете, проблема в том, что у вас нет безопасного пути назад к данным, введенным пользователем. Либо вы выполняете перенаправление HTTP / 301, а затем загружаете новую страницу, либо вы заставляете клиента работать history.back() с помощью JavaScript, а затем браузер может перезагрузить страницу.

Официальный способ сделать это - создать определение списка и настроить шаблон списка. Затем вы редактируете шаблон формы редактирования и включаете столько элементов управления валидатором ASP.Net, сколько необходимо. Затем реализуйте логику на стороне сервера по мере необходимости. В этой статье объясняется методика: http://msdn.microsoft.com/en-us/library/aa543922.aspx

РЕДАКТИРОВАТЬ: чтобы прикрепить настраиваемый элемент управления для редактирования определенного типа содержимого, вы добавляете раздел XmlDocuments в определение ContentType. Например, вот так

<ContentType
    ..........

    <XmlDocuments>
      <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
        <FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
          <Display>ContentTypeName_DispForm</Display>
          <Edit>ContentTypeName_EditForm</Edit>
          <New>ContentTypeName_NewForm</New>
        </FormTemplates>
      </XmlDocument>
    </XmlDocuments>
  .......

Затем вы создаете свой собственный yoursolution_controltemplates.ascx файл, который также содержит такие блоки: "

<SharePoint:RenderingTemplate ID="ContentTypeName_DispForm" runat="server"> 
<Template>
      <!-- put whatever controls you need here, we typically create a 
           separate custom control which implements everything-->
</Template>
</SharePoint:RenderingTemplate>
person naivists    schedule 12.01.2010
comment
Вывод HTML-кода все равно не работает - HTML кодируется перед отображением. Что все хорошо и останавливает эту ерунду. Обработчик событий прикреплен к типу контента, используемому в списке - знаете ли вы, можно ли связать шаблон формы редактирования с типом контента, а не с определением списка? - person marcus.greasly; 13.01.2010
comment
Спасибо, на самом деле у меня нет доступа к определениям типов контента, поэтому мне нужно сделать это в коде (приемник функций? Для обновления типа контента). Это должно быть возможно ..? - person marcus.greasly; 13.01.2010
comment
Кажется, что это возможно через API: olist.ContentTypes[0].EditFormTemplateName = "SomethingElse"; или даже olist.ContentTypes[0].EditFormUrl = "other";, но я не тестировал это, не знаю, работает ли он. - person naivists; 13.01.2010

Вы можете попробовать выполнить перенаправление с помощью CopyUtil: http://weblogs.asp.net/jan/archive/2008/02/26/copyutil-aspx-a-little-sharepoint-gem.aspx

link = "http://yoursite/_layouts/CopyUtil.aspx?Use=id&Action=dispform&ItemId=X&ListId=X&WebId=X&SiteId=X ";

Page.Response.Redirect (ссылка)

может это сработает

person Ciprian Grosu    schedule 13.01.2010