以编程方式更新当前页面属性时的权限问题

时间:2012-03-12 14:29:12

标签: sharepoint permissions

我有一个代表一个人的发布页面(一个联系表单,如果你愿意的话),我想让用户可以编辑表单中的一些信息(姓名,年龄,地点......)

所以我有一个编辑按钮,打开一个弹出窗口,其中包含允许用户更新的属性。

现在问题是:当用户按下保存按钮时,会抛出异常,说用户没有更新页面的权限。当我尝试结帐或更新页面时会发生这种情况

我的代码是:

    Guid siteId = SPContext.Current.Site.ID;
            Guid webId = SPContext.Current.Web.ID;
            SPSecurity.RunWithElevatedPrivileges(delegate()
           {
               //SPWeb currentWeb = SPContext.Current.Web;

               using (SPSite site = new SPSite(siteId))
               {
                   using (SPWeb currentWeb = site.OpenWeb(webId))
                   {
                       currentWeb.AllowUnsafeUpdates = true;

                       PublishingPage pubPage = PublishingPage.GetPublishingPage(SPContext.Current.ListItem);
                       pubPage.CheckOut();

                       pubPage.ListItem["EdificioContacto"] = dpEdificio.SelectedValue.ToString();
                       pubPage.ListItem["ExtensaoContacto"] = txtExtensao.Text;
                       pubPage.ListItem["FaxContacto"] = txtFax.Text;

                       pubPage.Update();


                       pubPage.ListItem.File.CheckIn("Alteracão de dados de utilizador. Processo automático");
                       pubPage.ListItem.File.Publish("Alteracão de dados de utilizador. Processo automático");
                       pubPage.ListItem.File.Approve("Alteracão de dados de utilizador. Processo automático");

                       currentWeb.AllowUnsafeUpdates = false;
                   }
               }

有人可以帮忙吗?

编辑:我的异常是“无法评估表达式,因为代码已优化或本机框架位于调用堆栈之上”。

我之前在另一个类上遇到过这个异常,但它是通过使用webId和siteId来打开网站和网络解决的,所以我认为这样可以解决它。

EDIT2:我注意到当我尝试以“普通”用户登录时以编程方式将项目添加到共享点列表时,也会出现这种情况。

1 个答案:

答案 0 :(得分:0)

参考:Edit State of page

检查此代码段:检查' ForceCheckout'

SPListItem item = SPContext.Current.ListItem;
//we cannot modify the page if we have a current item whos parent list has ForceCheckout set and the items file isn't checked out
bool canModifyPage = !(item != null && item.File != null && item.ParentList != null &&
item.ParentList.ForceCheckout && item.File.CheckOutStatus == SPFile.SPCheckOutStatus.None);

这也可能会对您的代码有所帮助:
Get PageLayout Name in Sharepoint but having a performance issue

修改:使用currentWeb.AllowUnsafeUpdates = true;进行检查。

参考:PublishingPage.CheckOut Method

// Get the PublishingPage wrapper for the SPListItem that was passed in.
            //
            PublishingPage publishingPage = null;
            if (PublishingPage.IsPublishingPage(listItem))
            {
                publishingPage = PublishingPage.GetPublishingPage(listItem);
            }
            else
            {
                throw new System.ArgumentException("This SPListItem is not a PublishingPage", "listItem");
            }


            // Check out the page if it is not checked out yet.
            //
            if (publishingPage.ListItem.File.CheckOutStatus == SPFile.SPCheckOutStatus.None)
            {
                publishingPage.CheckOut();
            }


            // Set and save some properties on the PublishingPage.
            //
            publishingPage.Title = newTitle;
            publishingPage.Description = newDescription;
            publishingPage.Contact = pageContact;
            publishingPage.Update();

比较它的页面属性访问方法和你的..如果有什么问题那么检查它..

 pubPage.ListItem["EdificioContacto"] = dpEdificio.SelectedValue.ToString();
 pubPage.ListItem["ExtensaoContacto"] = txtExtensao.Text;
 pubPage.ListItem["FaxContacto"] = txtFax.Text;

希望这有帮助..