Вопрос-Ответ

 Комментарии можно оставлять "здесь"

1.  Как в ЛЮБОЙ существующий список добавить (зарегистрировать) форму без SharePoint Designer и создания фичи в Visual Studio. Производная задача: в нескольких списках использовать одну форму, которая физически находится в одном месте.


а) Берём готовую форму (например, ApplicationPage2.aspx) и необходимые библиотеки для неё
б) Сохраняем форму среди решений SharePoint, например в какой-то уже нами написанной фиче: TEMPLATE\FEATURES\blog_Feature1\ListDefinition1
в) добавляем в GAC библиотеку
г) открываем БД с контентом, делаем запрос
SELECT *  FROM [dbo].[AllDocs]  where DirName like '%Lists/[название из URL]%'
д) Копируем строчку с LeafName равной DispForm.aspx
е) Меняем поля ID (случайно другое), LeafName (в нашем случаи ApplicationPage2.aspx), SetupPath (FEATURES\blog_Feature1\ListDefinition1\ApplicationPage2.aspx) на нам соответсвующие
ж) В таблицу AllDocs добавляем отредактированные значения
з) Проверяем доступность формы по адресу [название сервера]/Lists/[Название из URL]/\ApplicationPage2.aspx

2. Выполнить код с привилегиями администратора.

        SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                    using (SPSite site = new SPSite(SPContext.Current.Site.Url))
                    {
                        using (SPWeb web = site.OpenWeb(SPContext.Current.Web.ServerRelativeUrl))
                        {  
                           // необходимый код
                        }
                    }
            });

3. В форме представления скрыть ссылку "Добавить элемент (Add New)"


Применить стиль.  

    <style>
        td.ms-addnew { display:none; }
    </style>
Это чтобы убрать из веб-части представления.


    <style>
        #Ribbon\.ListItem\.New\.NewListItem-Large {display: none !important;}
    </style>
Это чтобы убрать из риббона.

Чтобы это не применить для всех списков, например из главной страницы, стоит применять его в форме представления или через Дизайнер или в разметке своей формы.

Есть и другой способ - это сделать тулбар представления равным "None": 

т.е. в схеме будет:
   <Views>
      <View BaseViewID="1"


        <Toolbar Type="None" >

Но в этом случаи не будут отображаться кастомные кнопки на риббоне, а только минимально стандартные.

4. Как сменить значения в "Моих параметрах" пользователя. 


Значения лежат в  системном списке "Список сведений о пользователях". Фактически всё сводится к редактированию полей записей как с обычным списком. 


Пример изменения картинки в параметрах текущего пользователя.


            SPUser user = web.CurrentUser;
            SPListItem userInfo = web.SiteUserInfoList.GetItemById(user.ID);
            userInfo["Picture"] = "http://server/Style%20Library/defaultFoto.jpg, Фото ";
            userInfo.Update(); 

Другие поля списка:

  "JobTitle", "Department", "SipAddress", "MobilePhone", "Title", "Notes", "Picture", "FirstName", "LastName", "WorkPhone", "UserName", "WebSite", "SPSResponsibility", "Office"

5. Как добавить файл в корень приложения SharePoint

Для этого необходимо добавить в свой проект "Пустой элемент" и в его папку (где лежит файл Elements.xml) добавить свой необходимый файл (например file.txt). Для файла в свойствах установим тип развёртывания равным ElementFile.
Отредактируем Elements.xml


<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Module Name="emptyElement">
    <File Path="emptyElement\file.txt" Url="file.txt" />
  </Module>
</Elements>

После активации фичи проверяем http://servername/file.txt


6. Как сделать PostBack из своего скрипта


document.getElementById("<%= hiddenField.ClientID %>").value = (new Date()).getTime(); //Изменяем значение в элементе
__doPostBack('<%= hiddenField.UniqueID %>', ''); //Делаем PostBack



7. Как отправить электронное сообщение пользователю

string title = string.Format("Новое сообщение");
string boby = string.Format("<HTML>Появилось новое сообщение<br><a href=\"http://{0}{1}\">Ссылка</a><br></HTML>",
       SPContext.Current.Site.HostName + ":" + SPContext.Current.Site.Port,                                    SPContext.Current.Web.ServerRelativeUrl);

            StringDictionary headers = new StringDictionary();
            headers.Add("to""user@....ru");
            headers.Add("subject", title);
            headers.Add("content-type""text/html");


            SPUtility.SendEmail(SPContext.Current.Web, headers, boby);

8. Как программно добавить веб-часть представления списка (xsltListViewWebPart)



protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                SPList list = SPContext.Current.Web.Lists.TryGetList("Контактный лица");

                XsltListViewWebPart xsltListViewWebPart = new XsltListViewWebPart();
                xsltListViewWebPart.ID = "wpListView";
                xsltListViewWebPart.Title = "1234";
                xsltListViewWebPart.ChromeType = System.Web.UI.WebControls.WebParts.PartChromeType.None;

                xsltListViewWebPart.WebId = list.ParentWeb.ID;
                xsltListViewWebPart.ListName = list.ID.ToString("B").ToUpper();
                xsltListViewWebPart.ListId = list.ID;
                xsltListViewWebPart.ViewGuid = list.Views["Все лица"].ID.ToString("B").ToUpper();

                FilterOperation fltrOp = new FilterOperation();
                fltrOp.FilterData = "OwnerGuid";
                fltrOp.FilterValue = SPContext.Current.ListItem["GUID"].ToString().Replace("{""").Replace("}""");

                xsltListViewWebPart.FilterOperations.Add("OwnerGuid", fltrOp);
                SetToolbarType(xsltListViewWebPart, "None");

                panel.Controls.Add(xsltListViewWebPart);
            }
        }

        public void SetToolbarType(XsltListViewWebPart lvwp, string viewType)
        {
            try
            {
                MethodInfo ensureViewMethod = lvwp.GetType().GetMethod("EnsureView"BindingFlags.Instance |BindingFlags.NonPublic);
                object[] ensureViewParams = { };
                ensureViewMethod.Invoke(lvwp, ensureViewParams);
                FieldInfo viewFieldInfo = lvwp.GetType().GetField("view"BindingFlags.NonPublic | BindingFlags.Instance);
                SPView view = viewFieldInfo.GetValue(lvwp) as SPView;
                Type[] toolbarMethodParamTypes = { Type.GetType("System.String") };
                MethodInfo setToolbarTypeMethod = view.GetType().GetMethod("SetToolbarType"BindingFlags.Instance |BindingFlags.NonPublic, null, toolbarMethodParamTypes, null);
                object[] setToolbarParam = { viewType }; //set the type here
                setToolbarTypeMethod.Invoke(view, setToolbarParam);
                view.Update();
            }
            catch { }


        }

9. Узнать путь к папке, где установлен SharePoint

      SPUtility.GetGenericSetupPath(string.Empty)


10. Как установить зависимость активации решения (или фичи) от другого решения (фичи).

Необходимо в соответствующем манифесте указать эти зависимости следующим способом

<?xml version="1.0" encoding="utf-8"?>
<Solution xmlns="http://schemas.microsoft.com/sharepoint/">
  <ActivationDependencies>
    <ActivationDependency SolutionId="cf55bf7c-d15f-4bd5-9155-e9565e10921a" />
  </ActivationDependencies>
</Solution>

<?xml version="1.0" encoding="utf-8" ?>
<Feature xmlns="http://schemas.microsoft.com/sharepoint/">
  <ActivationDependencies>
    <ActivationDependency FeatureId="cf55bf7c-d15f-4bd5-9155-e9565e10921a" />
  </ActivationDependencies>
</Feature>


11. Как получить информацию о пользователях из контролера домена (AD)

В проект необходимо добавить сборку System.DirectoryServices.AccountManagement


PrincipalContext ctx = new PrincipalContext(ContextType.Domain); // Если пользователь или группа находятся в домене
           // PrincipalContext ctx = new PrincipalContext(ContextType.Machine); // Если пользователь или группа находятся на локальной машине
            GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "Пользователи"); // Находим необходимую группу
            UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "motorin_vv"); // Находим необходимую группу

            if (group != null)
            {
                List<Principal> groupUsers = group.GetMembers().ToList(); // Список пользователей в группе

            }


12. Как установить адрес стартовой страницы
            
            SPFolder rootFolder = web.RootFolder;
            rootFolder.WelcomePage = "lists/sitepages/default.aspx";
            rootFolder.Update();

13. Как создать группу в SharePoint и добавить в неё пользователя

            SPGroupCollection collGroups = web.SiteGroups;
            if (!collGroups.Xml.Contains("new Group"))
                collGroups.Add("new Group", web.SiteAdministrators[0], null, "");

            SPGroup group = web.SiteGroups["new Group"];
            if (group != null)
                group.AddUser(user);

14. Как добавить разрешения к списку (сайту, элементу списка)

                SPList forumList = web.Lists["Форум"]; 
                forumList.BreakRoleInheritance(true, true);
                SPGroup group = web.SiteGroups["Все пользователи"];
                SPRoleAssignment roleAssignment = new SPRoleAssignment(group);
                SPRoleDefinition roleDefinition = web.RoleDefinitions["Совместная работа"];
                roleAssignment.RoleDefinitionBindings.Add(roleDefinition);
                forumList.RoleAssignments.Add(roleAssignment);

15. Как устранить ошибку: Попытка использование прекратившего существование объекта. (Исключение из HRESULT: 0x80030102 (STG_E_REVERTED))   

Возникает при добавлении нового элемента списка в момент вызова Update().
Необходимо проверить какие поля в схеме списка имеют значения по умолчанию (<Default>False</Default>). И этим полям обязательно присваивать значения перед вызовом Update().

16. Как сделать редирекс (перенаправление) на другую страницу из code behind

this.Page.Response.Redirect("URL");

17. Как перезапустить пул приложения SharePoint

%windir%\system32\inetsrv\appcmd stop apppool /apppool.name:"SharePoint - 80"
%windir%\system32\inetsrv\appcmd start apppool /apppool.name:"SharePoint - 80"

18. Открыть почтовый клиент из JavaScript


function SendEmail() {
                        var addresses = "mymail@mymail.ru";
                        var body = "body";
                        var subject = "subject"
                        var href = "mailto:" + addresses + "?" + "subject=" + subject + "&" + "body=" + body;
                        var wndMail;
                        wndMail = window.open(href, "_blank", "scrollbars=yes,resizable=yes,width=10,height=10");
                        if (wndMail) {
                            wndMail.close();
                        }

                    }

19 Как закрыть текущее окно без подтверждения пользователя


<script type='text/javascript'> window.open('', '_self', ''); window.close();</script>



20. Как вывести Alert сообщение пользователю из Code-Behind

if (!ClientScript.IsStartupScriptRegistered("alert"))
            {
                Page.ClientScript.RegisterStartupScript(this.GetType(),
                    "Message", string.Format("alert('{0}');", msg), true);
            }



21. Как добавить в библиотеку вики-страницу


string strUrl = string.Format("/SitePages/news_{0:yyyy_MM_dd_HH_mm_ss}.aspx", DateTime.Now);
           SPList list = web.Lists["Страницы сайта"];
           SPListItem itemWiki = list.RootFolder.Files.Add(strUrl, SPTemplateFileType.WikiPage).Item;

           itemWiki.UpdateOverwriteVersion();


Если не хотим добавлять по шаблону, который установлен по умолчанию, а использовать свой, то можно сделать следующее:



           SPFile templateFile = web.GetFile(web.Url + "/defaultWiki.aspx");
           byte[] binTemplateFile = templateFile.OpenBinary();
           SPListItem itemWiki = list.RootFolder.Files.Add(strUrl, binTemplateFile, false).Item;


22. Как переместить файл в списке в другую папку в списке

            SPListItem item = list.GetItemById(4);
            SPFile itemFile = web.GetFile(item.Url);
            string updatedUrl = "Lists/moving/folder2/4_.000";
            itemFile.MoveTo(updatedUrl);

23. Как сделать группировку в XSL преобразовании

Приведён пример группировки по году данных из списка по полю NewsDate
<xsl:for-each select="dsQueryResponse/Rows/Row[not(ddwrt:FormatDateTime(string(@NewsDate) ,1049 ,'yyyy')= ddwrt:FormatDateTime(string(following-sibling::Row/@NewsDate) ,1049 ,'yyyy'))]">
<xsl:variable name="CurYear" select="ddwrt:FormatDateTime(string(@NewsDate) ,1049 ,'yyyy')" /> 
<div style="margin:5px;float:left;">
<b><xsl:value-of select="$CurYear" /> </b>
</div>
<div style="margin:5px;float:left;">
<xsl:call-template name="Month">
<xsl:with-param name="CurYear" select="$CurYear"/>
</xsl:call-template>
</div>

</xsl:for-each>

 Комментарии можно оставлять "здесь"

Комментариев нет:

Яндекс.Метрика