2012-02-10 75 views
1

尽管我尽了最大的努力,我的任务是由我的雇主使用Sharepoint开发Web应用程序,而不是使用有用的东西。嵌套用户控件无法在Visual Web Part中工作

我在Visual Studio 2010的Sharepoint项目中将用户控件嵌入到Visual Web部件中时遇到了问题。我正在使用以下步骤(请注意,此代码仅仅是我的真实代码的简介目前包含足够的诅咒词让我禁止从终身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. 将可视Web部件添加到项目,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不包含“Property”和“扩展方法...”的定义,designer.cs文件确实将控件指定为UserControl,而不是其实际类型

由于这现在会产生构建错误,我无法将该项目部署到Sharepoint服务r,所以我不能真正解决这个intellisense问题。

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

有什么想法?事情我已经尝试:

  1. Web部件上的ASCX点击鼠标右键,然后单击“打开方式”,然后选择“带编码”选项。没有效果。

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

  3. 禁用项目的“调试后自动缩回”选项(建议从知识库文章中)。没有效果。

+0

你有解决方案吗?我被困在同一页面上。 – 2015-05-06 13:18:50

回答

1

创建可视Web部件时,您将获得“免费”控件。创建一个VWP,并将其粘贴到该控件中,而不是事先创建一个。

如果您想使用您已创建的控件,请创建一个常规Web部件并重写CreateChildControls(),并在其中创建控件实例。如果您已经拥有该控件,则无需使用VWP,因为SharePoint工具很可能会创建一些您不知道的绑定。

+0

这不是很有用。一般来说,ASP.NET开发的核心原则之一就是能够跨页面或其他用户控件重用用户控件。 – MisterZimbu 2012-02-12 00:45:53

+1

当然可以。我只是说,如果您想使用可视网页部件而不是常规Web部件,则应在创建VWP时使用提供给您的控件。然后,您可以单独重新使用该控件,也可以将Web部件放置在任意数量的页面上。 如果您想事先创建控件,请不要使用可视的Web部件;创建一个常规的Web部件并在CreateChildControls()中自己创建控件实例。 – Tobias 2012-02-12 06:49:12

+0

我不确定你是否理解这个问题。问题是我无法在VWP已经生成的ASCX中使用用户控件。我有一系列复杂的Web部件需要制作,并且我在这些Web部件中使用了一组通用用户控件,但是现在VS的可怕的Bug问题Sharepoint Project模板不允许我这样做。到目前为止,我可以想到几种解决方法,但在这一点上没有一种是真正需要的。 – MisterZimbu 2012-02-13 13:30:09

1

当你将参考标记写入ascx时,你有没有尝试过在VS中使用浏览机会?只是Src的打字后,应该出现=”

这应该确保引用是正确的。

而且,在你的用户控件工作时隐藏代码,你需要把它转换为它的正确类型能够访问你定义的属性,因为VS中的设计器文件将始终将其标识为UserControl。

+0

铸造是我想到的,但试图远离的解决方法之一,原因有两个:1)它可能导致一些凌乱的代码,不得不将所有东西都扔到不必要的地方,2)仍然不会在.ASCX文件中有智能感知。也许这个bug会在VS11中修复。 – MisterZimbu 2012-02-13 14:51:34

+0

我确实在我的ascx文件中得到了intellisense。它相信它依赖于VS可以解析Src参数中的引用。你是否按照我的建议尝试浏览ascx? – 2012-02-13 15:36:14

+0

这很奇怪 - 有时我确实懂得了智能感知,有时候我不知道,有时候我所获得的智能感知来自.ascx本身的几个小时的版本。当我收到intellisense时,.designer文件中用户控件的类型也会被正确设置。我认为核心问题在于GAC,但我无法通过部署,撤消或Visual Studio重新启动的任何组合来获得智能感知更新的一致行为。 – MisterZimbu 2012-02-13 17:10:20

1

您显示MyWebPart.ascx和MyWebPart.ascx.cs。我想你也有MyWebPart.cs。 This 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); 
    } 

如果要添加其他用户控件在Visual Web部件,你应该采取的标记蜂房下并加载它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,假设你的用户控件MyControl部署到GAC,后 一个IISRESET要注册的控制是这样的:

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

这方式你应该有智能感知和访问你的财产

相关问题