Вложенные пользовательские элементы управления не работают в визуальной веб-части - PullRequest
1 голос
/ 11 февраля 2012

Несмотря на все мои усилия, мой работодатель поручил мне разработать веб-приложение с использованием Sharepoint вместо чего-то полезного.

У меня возникают проблемы при встраивании пользовательских элементов управления в визуальные веб-части в проекте Sharepoint в Visual Studio 2010. Я использую следующие шаги (обратите внимание, что этот код является лишь кратким изложением того, что у меня есть - как мой настоящий код в настоящее время содержит достаточно ругательств, чтобы забанить меня в StackOverflow на всю жизнь):

  1. Создание нового пустого проекта Sharepoint.

  2. Добавить пользовательский элемент управления в проект (расположенный в шаблонах ControlTemplates) с именем MyControl.ascx

MyControl.ascx:

<asp:TextBox runat="server" ID="txtStuff" />

MyControl.ascx.cs:

public class MyControl : UserControl 
{
    public int Property { get; set; }

    protected void Page_Load(object sender, EventArgs e) 
    {
        txtStuff.Text = "I hate you sharepoint";
    }
}
  1. Добавление визуальной веб-части в проект, MyWebPart.ascx

MyWebPart.ascx

<%@ Register TagPrefix="c" TagName="MyControl" src="~/_controlTemplates/MyControl" %>
<c:MyControl runat="server" ID="mycontrol" />

Когда я дохожу до этого момента, я не получаю никакого смысла для MyControl, скорее всего, потому что VS не знает о существовании файла .ascx. Я также получаю зеленую волнистую линию под контрольным именем, сообщая мне, что ее не существует. Однако я все еще могу развернуть проект на самом сервере Sharepoint, и все будет работать хорошо.

Однако это разваливается, когда мне нужно что-то полезное, взаимодействуя с самим элементом управления:

MyWebPart.ascx.cs

protected void Page_Load(object sender, EventArgs e) {
    mycontrol.Property = 1234;
}

Что приводит к ошибке «System.Web.UI.UserControl не содержит определения« Свойство »и метода расширения ...». Файл designer.cs действительно определяет элемент управления как UserControl, а не его реальный тип.

Поскольку теперь это приводит к ошибке сборки, я не могу развернуть проект на сервере Sharepoint, поэтому я не могу обойти эту проблему intellisense.

Я обнаружил, что это очень противоречивое поведение; иногда появляется intellisense, в зависимости от того, развернут ли проект на сервере или нет. Тем не менее, я не могу предсказать набор шагов, которые я смог бы предпринять, чтобы привести среду разработки в рабочее состояние.

Есть мысли? Вещи, которые я пробовал:

  1. Щелкните правой кнопкой мыши ASCX веб-части, выберите «Открыть с помощью ...» и выберите параметр «С кодированием». Без эффекта.

  2. Разработка с использованием приложения, развернутого и отозванного, а также различных комбинаций закрытия и повторного открытия файлов .ascx, решения и самой Visual Studio. Иногда работает, иногда нет.

  3. Отключена опция проекта «Автоотвод после отладки» (рекомендуется из статьи базы знаний). Без эффекта.

Ответы [ 3 ]

1 голос
/ 13 февраля 2012

Вы пытались использовать возможность просмотра в VS, когда пишете тег ссылки в свой ascx?Он должен появиться сразу после ввода Src = "

. Это должно гарантировать правильность ссылки.

Кроме того, при работе с usercontrol в вашем коде, вы должны привести егоэто правильный тип, чтобы иметь возможность доступа к свойствам, которые вы определили, поскольку файл конструктора в VS всегда будет просто идентифицировать его как UserControl.

1 голос
/ 03 января 2013

Вы показываете MyWebPart.ascx и MyWebPart.ascx.cs. Я полагаю, у вас также есть MyWebPart.cs. Этот MyWebPart.cs загружает userControl MyWebPart.ascx.

У вас должно быть что-то вроде этого:

 private const string _ascxPath = @"~/_CONTROLTEMPLATES/YourPath/MyWebPart.ascx";

    protected override void CreateChildControls()
    {
        Control control = Page.LoadControl(_ascxPath);
        Controls.Add(control);
    }

Если вы хотите добавить еще один userControl в визуальную веб-часть, вы должны взять разметку под кустом и загрузить ее так же, как загружен MyWebPart.ascx.

Пример:

 private const string _ascxPath = @"~/_CONTROLTEMPLATES//YourPath/MyWebPart.ascx";
 private const string _ascxPath2 = @"~/_CONTROLTEMPLATES/YourPath/MyControl.ascx";

 protected override void CreateChildControls()
 {
    Control control = Page.LoadControl(_ascxPath);
    Control control2 = Page.LoadControl(_ascxPath2);
    Controls.Add(control);
    Controls.Add(control2);
 }

Теперь на вашем MyWebPart.ascx, при условии, что ваш userControl MyControl развернут в GAC после того, как один iisreset вы должны зарегистрировать элемент управления следующим образом:

<%@ Register TagPrefix="MyTag" TagName="MyControl" Namespace="MyNamespace.Something" Assembly="MyAssembly.Something, version=1.0.0.0, Culture=neutral" %>

Таким образом, вы должны иметь intellisense и доступ к своим свойствам

1 голос
/ 11 февраля 2012

При создании визуальной веб-части вы получаете элемент управления «бесплатно». Создайте VWP и вставьте свои вещи в этот элемент управления вместо того, чтобы создавать их заранее.

Если вы хотите использовать уже созданный элемент управления, создайте обычную веб-часть, переопределите CreateChildControls () и создайте там свой экземпляр элемента управления. Бесполезно возиться с VWP, если у вас уже есть элемент управления, поскольку инструменты SharePoint, скорее всего, создают несколько привязок, о которых вы не знаете.

...