Ссылка на поля формы настраиваемого списка из кода и автоматическое заполнение их значениями - PullRequest
0 голосов
/ 13 июля 2009

Я сделал свой собственный NewForm.aspx для своего списка, и я хочу добавить некоторый пользовательский код к нему. Так что я наследую эту форму от своего собственного класса:

public class MyCustomNewForm : Microsoft.SharePoint.WebPartPages.WebPartPage

Теперь я хочу сослаться на некоторые из доступных полей, чтобы автоматически заполнять их для пользователя. (Javascript здесь не поможет, так как мне нужно получить некоторые данные из других списков).

Но я понятия не имею, как мне ссылаться на эти поля из файлов кода.

Код для поля элемента управления написан (ну, он был сгенерирован Sharepoint Designer при использовании команды Вставка> Элементы управления SharePoint> Форма настраиваемого списка ... ) на странице .aspx, например:

<SharePoint:FormField runat="server" id="ff1{$Pos}" ControlMode="New" FieldName="Title" __designer:bind="{ddwrt:DataBind('i',concat('ff1',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Title')}"/>

При взгляде на id во время выполнения, он безумно длинный

альтернативный текст http://img33.imageshack.us/img33/7495/ss20090713143352.png

Итак, как мне ссылаться на поля, чтобы я мог установить свойство Text для них в моем файле codebehind?

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Используйте WebDataForm элемент управления в вашем коде позади; вызвать его метод FindControl(@ID).

Вы можете выяснить идентификатор на странице сгенерированного HTML; используйте инструменты разработчика IE, например $ff21_, в данном случае ID = ff21

0 голосов
/ 15 июля 2009

Не возражайте против этого болезненного решения, но прокрутите вниз, чтобы увидеть правку.

Э-э, я нашел обходной путь. Но предупреждение! если вам не нужно использовать какие-либо объекты Sharepoint для динамического доступа к каким-либо значениям, то этот пост не для вас, вместо этого вы хотели бы прочитать некоторые из упомянутых статей.

Итак, чтобы предварительно заполнить некоторые поля в NewForm.aspx значениями из другого списка, сделайте следующее.

Короче говоря:

  1. Создайте свою форму элемента списка. Сделай это пошагово .

  2. Создать класс, который наследуется от Microsoft.SharePoint.WebPartPages.WebPartPage

  3. Унаследуйте этот класс в пользовательской форме aspx <% @ Page. Моя выглядит так: <code>Inherits="xx.MeetingWorkspace.Tasks_NewFormxx, xx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9f4da00116c38ec5"

  4. В protected override void OnInit(EventArgs e) функция использования FindControlRecursively для поиска объект ContentPlaceHolder с идентификатором "PlaceHolderMain" (Назовите это Функция this.Controls [0], а не на этот объект).

  5. Создание HtmlHiddenField объектов, присвоение значений и добавление атрибута "Заголовок" с использованием метода HtmlHiddenField.Attributes.Add(). Это понадобится для шага 7.

  6. Добавить скрытые поля в ContentPlaceHolder вы получили ранее.

  7. Используйте 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>

Этот скрипт можно найти в комментариях в этой статье.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...