尽管我付出了最大努力,但我的雇主还是要求我使用Sharepoint开发Web应用程序,而不是使用有用的东西。
我无法在Visual Studio 2010中的Sharepoint项目中将用户控件嵌入到Visual Web部件中。我正在使用以下步骤(请注意,此代码只是我所拥有的内容的概要 - 作为我当前的真实代码包含足够的诅咒词让我终身禁止StackOverflow:
创建一个新的空Sharepoint项目。
将用户控件添加到项目(位于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";
}
}
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,具体取决于项目当前是否部署到服务器。但是,我没有采取可预测的一系列步骤来使开发环境处于工作状态。
有什么想法?我尝试过的事情:
右键单击Web部件的ASCX并单击“打开方式...”并选择“使用编码”选项。没效果。
使用已部署和撤消的应用程序进行开发,以及关闭和重新打开.ascx文件,解决方案和Visual Studio本身的各种组合。有时工作,有时不工作。
禁用项目的“调试后自动撤回”选项(从知识库文章推荐)。没效果。
答案 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" %>
这样你应该有智能感知和访问你的属性