Sharepoint - захват сохранения события NewForm.aspx / Edit.aspx - PullRequest
0 голосов
/ 11 января 2010

Мне нравится настраивать разрешение пользователей после создания или редактирования элемента.

  1. Использование рабочего процесса для этого не было принято клиентом, потому что иногда рабочий процесс запаздывает.
  2. Я нашел подход Javascript:
    function PreSaveItem(){...}
    Но это не то, что я ищу из-за безопасности, и я все еще не думаю, что вы можете изменить разрешение пользователя в javascript (надеюсь, что нет).

Я просто хочу отредактировать NewForm.aspx и добавить код C #, который будет выполняться непосредственно перед или сразу после добавления / редактирования элемента.

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 января 2010

Вам придется подождать, пока элемент не будет создан, а затем BreakRoleInheritance() на нем.

public class MyListHandler : Microsoft.SharePoint.SPItemEventReceiver
{
 public override void ItemAdded(SPItemEventProperties properties)
    {
        base.ItemAdded(properties);

        properties.ListItem.BreakRoleInheritance(false);
        //you will have to add the required permissions here
      }
  }

Однако имейте в виду, что у вас возникнут некоторые проблемы, если пользователь добавит элемент, а затем сразу попытается открыть «DispForm.aspx». Это связано с тем, что приемник событий работает в параллельном потоке, и, если BreakRoleInheritance выполняется в этот момент, пользователь может не иметь доступа для чтения к элементу. Следовательно, может появиться ошибка «Отказано в доступе».

РЕДАКТИРОВАТЬ: Когда вы хотите развернуть ваш обработчик событий, вы обычно создаете функцию, которую можно активировать / деактивировать в веб-области. Затем вы ловите «активированную функцию» и вызываете такую ​​функцию:

Public Sub AddEventHandlerToList( _
          ByVal opList As SPList, _
          ByVal spAssemblyName As String, _
          ByVal spClassName As String, _
          ByVal ipType As SPEventReceiverType)
    opList.EventReceivers.Add(ipType, spAssemblyName, spClassName)
    opList.Update()
End Sub

Функция может быть определена как:

<?xml version="1.0" encoding="utf-8"?>
 <Feature  Id="{ABABABE1-1234-5678-9012-345678912345}"
      Title="MySuperFeature
      Description="Something more descriptive here"
      Scope="Web"
      DefaultResourceFile="core"
      ReceiverAssembly="your.assembly.name, Version=1.0.0.0, Culture=neutral, PublicKeyToken=546479a7bab11231"
      ReceiverClass="your.namespace.MyListHandler"   
      xmlns="http://schemas.microsoft.com/sharepoint/">       
</Feature>

EDIT2: если вам действительно нужно сделать это в newform.aspx, вы должны добавить некоторый элемент управления, отображаемый на странице. Внутри этого элемента управления вы устанавливаете OnSaveHandler

 SPContext.Current.FormContext.OnSaveHandler = AddressOf onSave

Затем реализуйте свою собственную функцию сохранения:

Public Sub onSave(ByVal sender As Object, ByVal e As EventArgs)
    Dim sRedirectUrl As String
    Dim operation As SPLongOperation = Nothing
        operation = New SPLongOperation(Me.Page)
        operation.Begin()

        If SaveButton.SaveItem(SPContext.Current, False, "") Then
            sRedirectUrl = SPUrlUtility.CombineUrl(SPContext.Current.Site.Url, SPContext.Current.List.Forms.Item(PAGETYPE.PAGE_DISPLAYFORM).Url)
            sRedirectUrl &= "?ID=" & SPContext.Current.Item.ID
        End If

        SPContext.Current.Item.BreakRoleInheritance(false);

        operation.End(sRedirectUrl)
End Sub
0 голосов
/ 11 января 2010

Почему бы не создать SPItemEventReceiver и связать его со списком / типом контента?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...