вторник, 20 ноября 2012 г.

Как привязать к списку свои ASPX-формы

Как быстро и просто программным способом назначить для списка свои формы, лежащие в _layouts? Для этого нужно взять у списка нужный тип содержимого и подменить часть XML в его определении. Для примера возьмём первый попавшийся тип содержимого и назначим ему формы просмотра и редактирования:

1 вариант:
var ct = list.ContentTypes[0];
string ns = "http://schemas.microsoft.com/sharepoint/v3/contenttype/forms/url";
var xml = new System.Xml.XmlDocument();
xml.LoadXml(
"<FormUrls xmlns=\"" + ns + "\">" +
    "<Display>_layouts/MyDisplayForm.aspx</Display>" +
    "<Edit>_layouts/MyEditForm.aspx</Edit>" +
"</FormUrls>");
ct.XmlDocuments.Delete(ns);
ct.XmlDocuments.Add(xml);
ct.Update();

2 вариант:
public static void AddFormToList(SPWeb web, string sitePrefix, string listname, string formName, string webPartName, PAGETYPE pageType)
        {
            string errorMessage = "Import error";

            web.AllowUnsafeUpdates = true;

            //get current list
            SPList currentList = web.Lists.TryGetList(listname);

            if (currentList == null)
                return;

            //get web part gallery
            SPList wpGallary = ListTools.GetListByRelativePath(web, "_catalogs/wp");

            if (wpGallary == null)
                return;

            if (!formName.Contains(".aspx"))
                formName = formName + ".aspx";

            //get root folder
            SPFolder root = currentList.RootFolder;

            //form url
            string customFormUrl = SPUrlUtility.CombineUrl(web.ServerRelativeUrl, "/" + root.Url + "/" + formName);

            //get page
            SPFile page = web.GetFile(customFormUrl);

            if (!page.Exists)
                page = root.Files.Add(customFormUrl, SPTemplateFileType.FormPage);

            //get part from gallery
            SPListItemCollection collect = wpGallary.GetItems(new SPQuery() { Query = string.Format("<Where><Eq><FieldRef Name='Title'/><Value Type='Text'>{0}</Value></Eq></Where>", webPartName) });

            if (collect.Count > 0)
            {
                using (SPLimitedWebPartManager wpmgr = page.GetLimitedWebPartManager(PersonalizationScope.Shared))
                {
                    //add empty part
                    DataFormWebPart webPart = new DataFormWebPart();
                    IListWebPart part = webPart;
                    part.ListId = currentList.ID;
                    part.PageType = pageType;
                    wpmgr.AddWebPart(webPart, "Main", 1);

                    //add custom part
                    string webpartString = web.GetFileAsString(web.Url + "/" + collect[0].File.Url);
                    string webPartXml = new StringReader(webpartString).ReadToEnd();
                    XmlTextReader reader = new XmlTextReader(new StringReader(webPartXml));
                    System.Web.UI.WebControls.WebParts.WebPart importWebPart = wpmgr.ImportWebPart(reader, out errorMessage);
                    importWebPart.Title = webPartName;
                    wpmgr.AddWebPart(importWebPart, "Main", 0);
                }

                switch (pageType)
                {
                    case PAGETYPE.PAGE_DISPLAYFORM:
                        currentList.DefaultDisplayFormUrl = customFormUrl;
                        break;
                    case PAGETYPE.PAGE_EDITFORM:
                        currentList.DefaultEditFormUrl = customFormUrl;
                        break;
                    case PAGETYPE.PAGE_NEWFORM:
                        currentList.DefaultNewFormUrl = customFormUrl;
                        break;
                    default:
                        break;
                }

                currentList.Update();
            }

            web.AllowUnsafeUpdates = false;
        }

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

Отправить комментарий