我已经制作了一个继承自Literal控件的自定义控件。当我尝试在页面上使用我的控件时,会抛出解析错误。我已将此添加到我的web.config
<configuration>
<system.web>
<pages>
<controls>
<add tagPrefix="one" namespace="myApplication.Controls"/>
</controls>
</pages>
</system.web>
</configuration>
我已将此添加到我的页面
<%@ register namespace="myApplication.Controls" tagprefix="one" %>
这些都没有解决问题。我有一个带有一些自定义控件的外部程序集,可以在我的项目中正常工作。作为一种解决方法,如果没有简单的解决方案,我正在考虑将我的自定义控件移动到外部库中。
- 编辑
这是页面代码。
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SignUp.ascx.cs" Inherits="myApplication.Controls.SignUp" %>
<%@ register namespace="myApplication.Controls" tagprefix="one" %>
<div class="in">
<span>
<one:resourceliteral id="lblFirstname" runat="server" resourcekey="FirstName" resourceresolver="ResourceStringResolver.GetResourceString">
</one:resourceliteral>
</span>
<div>
<pl:textbox id="txtFirstName" runat="server"></pl:textbox>
</div>
</div>
这是我实际控制的代码
namespace myApplication.Controls
{
public class ResourceLiteral : Literal
{
private ResourceManager rm;
public delegate string dResourceResolver( string label, eLanguage language );
public event dResourceResolver ResourceResolver;
public string ResourceKey { get; set; }
public object DataSource { get; set; }
private eLanguage _Language = eLanguage.ENUS;
public eLanguage Language
{
get { return _Language; }
set { _Language = value; }
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (ResourceResolver != null)
Text = ResourceResolver.Invoke( ResourceKey, _Language );
else
{
if(rm != null)
{
Text = rm.GetString( ResourceKey );
}
}
}
public void LoadDataSource(string resource)
{
rm = new ResourceManager( resource, Assembly.GetExecutingAssembly() );
}
public void LoadDataSource(Type resource)
{
rm = new ResourceManager( resource );
}
}
}
答案 0 :(得分:77)
添加命名空间时,我发现我还需要程序集。如果您的程序集也是myApplication
,请在web.config中执行此操作:
<add tagPrefix="one" namespace="myApplication.Controls" assembly="myApplication"/>
然后,只需清理并重建,它应该全部工作。一旦这在你的web.config中,你不需要将它添加到你的页面,除非你在同一目录中的控件中使用它,那么你需要在Web表单顶部的引用。但是,我建议不要在与用户控件相同的目录中使用自定义服务器控件。
答案 1 :(得分:2)
我收到了&#34;未知的服务器代码&#34;作为项目一部分的用户控件的错误。没有外部装配。 @citronas提到&#34;如果这不起作用,你的控件可能无法编译。&#34;,这也被列为this troubleshooting post中最可能的原因。
虽然我的控制代码编译没有错误,但事实证明有警告我忽略了。我的警告是关于我的控制文件夹中引用另一个丢失文件的资源文件。一旦我解决了警告,那么控件编译正确,我能够使用只有一个Register指令的控件,而不是对web.config的修改,如下所示:
<%@ Register TagPrefix="myPrefix" TagName="myControl" Src="~/controls/mySourceFile.ascx" %>
<myPrefix:myControl runat="server"></myPrefix:myControl>
答案 2 :(得分:1)
如果我理解正确,你的控件是在同一个项目中吗?
尝试使用以下内容在页面标记中注册控件:
<%@ Register Src="~/controls/foo.ascx" TagName="foo" TagPrefix="uc" %>
使用<uc:foo ID="foo1" runat="server"/>
,您可以将控件包含在标记中。
如果这不起作用,您的控件可能无法编译。评论不必要的东西并再试一次。
答案 3 :(得分:1)
发布ASP.NET Web窗体应用程序时也遇到此问题。即使将文件夹复制并粘贴到服务器的IIS而不发布它,使用自定义控件/用户控件的页面上的类似问题也会系统地发生。
我在web.config上正确注册了控件,在我的开发机器上工作正常。我认为注册过程没问题。
要解决发布/复制和过去部署过程中的问题,您应该在使用它们的每个页面(.aspx)上重新注册所有用户控件的命名空间和程序集:
<%@ Register TagPrefix="mycompany" Namespace="MyCompany.Web.Forms.Controls" Assembly="MyCompany.Web" %>
<%@ Register TagPrefix="mycomapny" Namespace="MyCompany.Web.Forms.Controls.ValidatorComponents" Assembly="MyCompany.Web" %>
请注意,自定义控件或用户控件的思维方式相同。这个问题甚至发生在VS 2012中,但仍然是.NET 4.0。当ASP.NET皮肤引用此类控件时,也需要此过程。
答案 4 :(得分:0)
在我的情况下,应用程序在本地模式下运行,发布时从用户控件标签中得到了相同的错误。
在注释用户控件标签时,发现另一个地方出现路径错误。解决了另一个问题并取消了对用户控件标签的注释后,它开始起作用。似乎显示的错误与无关。