SharePoint SPContext.List на пользовательской странице приложения
У меня есть пользовательская страница приложения SharePoint, развернутая в папке _layouts. Это пользовательская "новая форма" для пользовательского типа контента. Во время моего взаимодействия с этой страницей мне нужно будет добавить элемент в мой список. Когда страница загружается впервые, я могу использовать SPContext.Current.List, чтобы увидеть текущий список, с которым я работаю. Но после того, как я заполнил свою форму, и форма отправляется обратно на себя, а IsPostBack имеет значение true, тогда SPContext.Current.List имеет значение null, поэтому я не могу найти список, в который мне нужно добавить свои материалы.
Это ожидается?
Как мне сохранить некоторую информацию о моем контекстном списке через обратную передачу? Должен ли я просто заполнить некоторый элемент управления asp: hidden подсказкой моего списка, а затем просто вытянуть его обратно из обратной передачи? Кажется, это безопасно.
Кстати, это стандартная версия MOSS 2007.
4 ответа
Вообще говоря, я пытаюсь скопировать любой подход, который использовала группа продуктов, когда я пытаюсь добавить свою собственную функциональность. В этом случае они добавляют свои собственные страницы редактирования / просмотра / добавления через само определение списка.
Я создал решение, которое также нуждалось в собственной настраиваемой "новой" форме, к сожалению, не с открытым исходным кодом, хотя, если вы заинтересованы, вы можете скачать ее, она называется "Метки с ссылками" (Social Bookmarking for SharePoint), и вы можете найти некоторые ссылки на моем блог.
Чтобы дать вам несколько советов и подсказок, следующее должно направить вас в правильном направлении:
- Создано новое определение списка.
- Создан новый тип контента В типе контента вы можете определить свои собственные "FormTemplates", которые ссылаются на шаблон рендеринга, который определяет, что отображается в "среднем" бите этих форм.
- Скопировал стандартный шаблон рендеринга, но затем внес в него необходимые изменения.
- Обернул все это в решение и развернул.
Мой шаблон рендеринга фактически содержал переопределенную кнопку "Сохранить", где я выполнил большую часть дополнительной работы, которую мне нужно было выполнить во время сохранения.
В любом случае, на мой взгляд, это слишком сложная работа, но, думаю, она наиболее близко соответствует стандартному подходу разработчиков продукта. Дайте мне знать, если вам нужно больше подробностей, и я посмотрю, смогу ли я составить пошаговое сообщение в блоге, но, надеюсь, это направит вас в правильном направлении.
Я был бы удивлен, если бы вы могли сделать что-то в файле _Layouts, что вы не можете сделать в шаблоне форм. В вашем распоряжении практически такие же технологии.
Глядя на то, как SharePoint работает со страницами ListItems и Layouts (например, "Управление разрешениями" для элемента списка), я вижу, что они передают некоторые переменные через строки запроса:? Obj={76113B3A-FABA-4389-BC85-4BB2CC5AB423},6,ListItem & Список = {76113B3A-ФАБ-4389-BC85-4BB2CC5AB423}
Возможно, они каждый раз программно получают контекст обратно, используя эти значения.
Я хотел бы думать, что моя проблема здесь "особенная", так как я использую пользовательскую форму. Я решил использовать пользовательскую форму, а не пользовательский шаблон FormTemplate просто потому, что я делаю много вещей, которые не очень похожи на списки SharePoint (совершая ajax-вызовы для получения информации из стороннего приложения, затем генерируя некоторые динамические элементы формы на основе этот результат ajax, затем последующая обработка этих данных при обратной передаче). Я думал, что это будет кошмар, чтобы попробовать это в обычном механизме шаблонов рендеринга.
Я также не думаю, что смогу предоставить объявления пользовательских форм в самом определении списка, потому что у меня есть несколько типов контента, связанных с этим списком, и каждый тип контента имеет свою собственную пользовательскую форму (другой тип, к счастью, намного проще).
На самом деле, мой простой способ сохранения списка в моей скрытой области был очень слабым способом решения этой конкретной проблемы. Моя главная проблема заключается в том, что я не уверен, почему SPContext просто теряет всю свою полезность, когда я публикую здесь, что заставляет меня думать, что я делаю что-то не так.
Я не использую пользовательскую "новую форму", поэтому это может не применяться. Я добавил получатель событий в свой пользовательский тип контента и затем сделал свой пользовательский код в событиях ItemAdded или ItemAdding. Этот код срабатывает, когда событие добавляется в список. Вы можете использовать свойства получателя событий для доступа к родительскому списку, веб-сайту и сайту.