嵌套的用户控件在Visual Web部件中不起作用

时间:2012-02-10 21:21:14

标签: sharepoint-2010 user-controls web-parts

尽管我付出了最大努力,但我的雇主还是要求我使用Sharepoint开发Web应用程序,而不是使用有用的东西。

我无法在Visual Studio 2010中的Sharepoint项目中将用户控件嵌入到Visual Web部件中。我正在使用以下步骤(请注意,此代码只是我所拥有的内容的概要 - 作为我当前的真实代码包含足够的诅咒词让我终身禁止StackOverflow:

  1. 创建一个新的空Sharepoint项目。

  2. 将用户控件添加到项目(位于ControlTemplates中),名为MyControl.ascx

  3. 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. 将Visual Web部件添加到项目MyWebPart.ascx
    2. 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不包含'Property'的定义,也没有扩展方法......'。designer.cs文件确实将控件指定为UserControl,而不是真实的类型。

      由于这会产生构建错误,我无法将项目部署到Sharepoint服务器,因此我无法解决此intellisense问题。

      我发现这是非常不一致的行为;有时会出现intellisense,具体取决于项目当前是否部署到服务器。但是,我没有采取可预测的一系列步骤来使开发环境处于工作状态。

      有什么想法?我尝试过的事情:

      1. 右键单击Web部件的ASCX并单击“打开方式...”并选择“使用编码”选项。没效果。

      2. 使用已部署和撤消的应用程序进行开发,以及关闭和重新打开.ascx文件,解决方案和Visual Studio本身的各种组合。有时工作,有时不工作。

      3. 禁用项目的“调试后自动撤回”选项(从知识库文章推荐)。没效果。

3 个答案:

答案 0 :(得分:1)

创建可视webpart时,您可以“免费”获取控件。创建一个VWP并将您的东西粘贴到该控件中,而不是事先创建一个。

如果要使用已创建的控件,请创建常规webpart并覆盖CreateChildControls(),然后在其中创建控件实例。如果您已经拥有控件,则不会使用VWP,因为SharePoint工具很可能会创建一些您不知道的绑定。

答案 1 :(得分:1)

在将参考标记写入ascx时,您是否尝试在VS中使用browse-opportunity?它应该在输入Src =“

之后出现

这应该确保参考是正确的。

此外,在代码隐藏中使用usercontrol时,需要将其转换为正确的类型才能访问已定义的属性,因为VS中的设计器文件始终只是将其标识为UserControl

答案 2 :(得分:1)

您将显示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);
    }

如果要在可视化Web部件中添加另一个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" %>

这样你应该有智能感知和访问你的属性