Не возражайте против этого болезненного решения, но прокрутите вниз, чтобы увидеть правку.
Э-э, я нашел обходной путь. Но предупреждение! если вам не нужно использовать какие-либо объекты Sharepoint для динамического доступа к каким-либо значениям, то этот пост не для вас, вместо этого вы хотели бы прочитать некоторые из упомянутых статей.
Итак, чтобы предварительно заполнить некоторые поля в NewForm.aspx значениями из другого списка, сделайте следующее.
Короче говоря:
Создайте свою форму элемента списка. Сделай это пошагово .
Создать класс, который наследуется от
Microsoft.SharePoint.WebPartPages.WebPartPage
Унаследуйте этот класс в пользовательской форме aspx <% @ Page. Моя выглядит так: <code>Inherits="xx.MeetingWorkspace.Tasks_NewFormxx, xx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5"
В protected override void
OnInit(EventArgs e)
функция использования
FindControlRecursively для поиска
объект ContentPlaceHolder с идентификатором
"PlaceHolderMain" (Назовите это
Функция this.Controls [0], а не на
этот объект).
Создание HtmlHiddenField
объектов, присвоение значений и добавление атрибута "Заголовок" с использованием метода HtmlHiddenField.Attributes.Add()
. Это понадобится для шага 7.
Добавить скрытые поля в
ContentPlaceHolder вы получили
ранее.
Используйте Javascript (читать здесь или здесь ) для
заполните нужные поля от
скрытые значения полей для этих полей
этот пользователь видит.
P.S. Я новичок на sharepoint, поэтому лучше используйте эти шаги с осторожностью. Я был бы рад найти ответ, где вы можете ссылаться на свои поля в коде, поэтому мне не нужно использовать какие-либо javascript вещи.
Мое длинное путешествие:
Как я уже говорил, я унаследовал свой собственный открытый класс для этой формы. С помощью этого метода должна быть возможность ссылаться на существующее поле формы, объявляя эти элементы управления класса именем переменной, таким же, как идентификатор формы. На скриншоте у меня есть TextBox
объект класса с идентификатором ctl00_PlaceHolderMain_g_77625 .... и т. Д.
Теперь в моем классе я попытался создать переменную с тем же именем, что и ID, но она не инициализируется, и значение равно нулю. Я подумал, что, может быть, идентификатор меняется, я проверил, но нет, он остается прежним.
Поэтому я попытался использовать Control.FindControl, но он не выполняет рекурсивный поиск, поэтому я нашел эту статью: Рекурсивный Page.FindControl . (Возможно, вы захотите прочитать некоторые комментарии, так как есть лучшие реализации с обобщениями). Важное замечание: Прочтите комментарий "Сэм, 2 августа 2008 г., 4:13" перед использованием метода FindControlRecursive.
Итак, с функцией в руках я передал идентификатор в качестве аргумента - все равно не повезло, он просто возвращает мне ноль. К счастью, я мог передать PlaceHolderMain как ID, и он вернул бы мне основной объект-заполнитель.
Таким образом, в качестве обходного пути можно использовать переопределенный метод OnInit(EventArgs)
сделать объекты HtmlHiddenField, установить их значения в соответствии с вашими предпочтениями и добавить эти скрытые поля в PlaceHolderMain. (ContentPlaceHolder.Controls.Add()
)
Затем с помощью некоторого javascript на странице ASPX я смог загрузить значения из скрытых полей в мои предпочитаемые поля (ну, я нашел способ ссылаться на нужные мне поля с помощью javascript. Две полезные статьи для этого: короче и длиннее )
Редактировать: Менее болезненное решение
О, рад, что нашел это.
С jPoint (jQuery for SharePoint), а затем с некоторым сценарием вы можете использовать параметры строки запроса для предварительного заполнения полей списка.
<script type="text/javascript" src="//sharejpoint.googlecode.com/files/jPointLoader-0.6-expanded.js" ></script>
<script>
$(document).ready(function() {
jP.Form.readForm();
$.each(jP.Form.Items, function (idx, item) {
if(querySt(item.Name) != null && querySt(item.Name) != "undefined")
jP.Form[item.Name].val(unescape(querySt(item.Name)));
});
});
//Gets value of querystring key
function querySt(ji)
{
hu = window.location.search.substring(1);
gy = hu.split("&");
for (i=0;i<gy.length;i++)
{
ft = gy[i].split("=");
if (ft[0].toUpperCase() == ji.toUpperCase()) //Fixed query so it is case insensitive
{
return ft[1];
}
}
}
</script>
Этот скрипт можно найти в комментариях в этой статье.