2011-11-22 74 views
0

我有以下Sharepoint問題:我創建了一個Ribbon Button,它表示「只讀」。當我在列表中,並檢查一些項目時,我想將這些項目設置爲只讀。 功能區按鈕效果很好,當我正在做警報或某事時,我會得到答案。所以這不是問題。我做了以下幾點:Sharepoint中列表項的只讀按鈕

var listitem; 
var roleAssgn; 
var Assgn; 
var selectedItems; 

function readonly() { 
    selectedItems = SP.ListOperation.Selection.getSelectedItems(); 
    var currentListGuid = SP.ListOperation.Selection.getSelectedList(); 

    var context = SP.ClientContext.get_current(); 
    var currentWeb = context.get_web(); 
    var currentList = currentWeb.get_lists().getById(currentListGuid); 

    for (k in selectedItems) { 
     listitem = currentList.getItemById(selectedItems[k].id); 
     context.load(listitem, 'RoleAssignments'); 
     context.executeQueryAsync(Function.createDelegate(this, this.readonlyPerItem), Function.createDelegate(this, this.failed)); 
    } 
} 

function readonlyPerItem(sender, args) { 
    var k; 
    var Assgn; 
    var r; 
    context = SP.ClientContext.get_current(); 
    roleAssgn = listitem.get_roleAssignments(); 

    for(r in roleAssgn){ 
     Assgn = roleAssgn[r]; 
     alert("1"); 
     context.load(Assgn, 'RoleDefinitionBindings'); 
     alert("2"); 
     context.executeQueryAsync(Function.createDelegate(this, this.readonlyPerRoleA), Function.createDelegate(this, this.failed)); 
    } 
} 

function readonlyPerRoleA(sender, args) { 
    var bindings = Assgn.get_roleDefinitionBindings(); 
    var member = Assgn.get_member(); 
} 

function failed(sender, args) { 
     alert("FAIL"); 
} 

這很好,直到它得到警報。 Alert-1正在工作,但不是Alert-2。調試器說:該對象不支持屬性「get_ $ h」。 而在sp_runtime.js出現這種情況有:

SP.DataRetrievalWithExpressionString $ 1Q_0(a.get_ $ H(),d)

我真的發現了問題所在。這是一個錯誤還是僅僅是不可能?

回答

0

好吧,我用另一種方式來做到這一點,並想讓你知道,它是如何爲我工作的。我在Ribbon菜單中使用了一個JS來調用另一個網站,這只是一個空的網站。我添加了參數(listguid,siteurl和itemid的逗號分隔)。 然後,該網站只是打印一個「真」或「假」。這個響應將被我的Ribbon JS抓住,並顯示一些消息,如果它工作或沒有。這是我的絲帶JS​​:

<CustomAction 
    Id="ReadOnlyButton" 
    RegistrationId="101" 
    RegistrationType="List" 
    Location="CommandUI.Ribbon" 
    Sequence="15" 
    Rights="ManageLists" 
    Title="Set Readonly"> 
    <CommandUIExtension> 
     <CommandUIDefinitions> 
     <CommandUIDefinition 
      Location="Ribbon.Documents.Manage.Controls._children"> 
      <Button 
      Id="Ribbon.Documents.ReadOnly" 
      Command="ReadOnly" 
      Sequence="15" 
      Image16by16="/_layouts/1031/images/formatmap16x16.png" 
      Image16by16Left="-80" 
      Image16by16Top="-128" 
      Image32by32="/_layouts/1031/images/formatmap32x32.png" 
      Image32by32Left="-160" 
      Image32by32Top="-256" 
      Description="Read Only" 
      LabelText="Read Only" 
      TemplateAlias="o1"/> 
     </CommandUIDefinition> 
     </CommandUIDefinitions> 
     <CommandUIHandlers> 
     <CommandUIHandler 
     Command="ReadOnly" 
     CommandAction="javascript: 
      var nid; 
      function getItemIds() 
      { 
      var itemIds = ''; 
      var items = SP.ListOperation.Selection.getSelectedItems(); 
      var item; 
      for(var i in items) 
      { 
       item = items[i]; 
       if(itemIds != '') 
       { 
       itemIds = itemIds + ','; 
       } 
       itemIds = itemIds + item.id;    
      } 
      return itemIds; 
      } 
      function handleReadyStateChange() 
      { 
      if (client.readyState == 4) 
      { 
       if (client.status == 200) 
       { 
       SP.UI.Notify.removeNotification(nid); 
       if(client.responseText == 'True') {     
        nid = SP.UI.Status.addStatus('The Rights has been set successfully', '', true); 
        SP.UI.Status.setStatusPriColor(nid, 'green'); 
       } else { 
        nid = SP.UI.Status.addStatus('Error while setting Rights', '', true); 
        SP.UI.Status.setStatusPriColor(nid, 'red'); 
       } 

        window.setTimeout('SP.UI.Status.removeStatus(\'' + nid + '\')', 5000); 
       } 
      } 
      } 
      function invokeReadOnly() 
      { 
      var itemLength = 0; 
      var params = 'itemids=' + getItemIds(); 
      for (var i=0;i&lt;params.length;i++) { if (',' == params.substr(i,1)) { itemLength++; } } 

      if(itemLength > 0) { 
       nid = SP.UI.Notify.addNotification('Rights set for ' + (itemLength +1) + ' elements...', true); 
      } else { 
       nid = SP.UI.Notify.addNotification('Set Rights...', true); 
      } 

      var site='{SiteUrl}'; 
      var url = site + '/_layouts/ReadOnly.aspx?listId={ListId}'; 
      client = null; 
      client = new XMLHttpRequest(); 
      client.onreadystatechange = handleReadyStateChange; 
      client.open('POST', url, true);   
      client.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
      client.setRequestHeader('Content-length', params.length); 
      client.send(params); 
      }  
      invokeReadOnly();" 

     EnabledScript="javascript: 
      function enableReadOnly() 
      { 
      var items = SP.ListOperation.Selection.getSelectedItems(); 
      return (items.length > 0); 
      } 
      enableReadOnly();"/> 
     </CommandUIHandlers> 
    </CommandUIExtension> 
    </CustomAction> 

這是它背後(ReadOnly.aspx)我的網站:

protected void Page_Load(object sender, EventArgs e) 
{ 
    string itemidsAll = Page.Request["itemids"]; 
    string listId = Page.Request["listId"]; 
    bool set = true; 

    if (!String.IsNullOrEmpty(itemidsAll)) 
    { 
     string[] itemIds = itemidsAll.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
     int item = 0; 

     SPSite _site = null; 
     SPListItem spitem = null; 
     SPSecurity.RunWithElevatedPrivileges(delegate() 
     { 
      _site = new SPSite(SPContext.Current.Site.ID); 
     }); 
     using (SPWeb web = _site.OpenWeb()) 
     { 
      web.AllowUnsafeUpdates = true; 
      SPList doclib = SPContext.Current.Web.Lists.GetList(new Guid(listId), false);     

      foreach (string itemId in itemIds) 
      { 
       if (Int32.TryParse(itemId, out item)) 
       { 
        spitem = doclib.GetItemById(item); 
        set &= SetItem(spitem, SPContext.Current, ref _site); 
       } 
      } 

      web.AllowUnsafeUpdates = false; 
     } 
     _site.Dispose(); 
    } 

    Response.Clear(); 
    Response.Write(set.ToString()); 
    Response.End(); 
} 

的SetItem,方法是設定權利。你可以在那裏使用你自己的東西:)