用户控件的内部属性不支持代码块,但面板支持?

时间:2016-05-09 14:42:36

标签: c# asp.net user-controls

我的UserControl与<asp:Panel>非常相似。

虽然专家组可以这样做:

<asp:Panel runat="server">
    <img src='<%= ResolveUrl("~/img.png")%>' />
</asp:Panel>

使用我的控件尝试此操作时出错:

<uc1:NotPanel runat="server">
    <img src='<%= ResolveUrl("~/img.png")%>' />
</uc1:NotPanel>
  

错误:此上下文不支持代码块

NotPanel的引用方式如下:

<%@ Register Src="~/Controls/NotPanel.ascx" TagName="NotPanel" TagPrefix="uc1" %>

并定义如下(这是一个严格剥离的版本):

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="NotPanel.ascx.cs" Inherits="MyNamespace.NotPanel" %>
<div class="something">
    <asp:PlaceHolder ID="phControls" runat="server" />
</div>

使用此代码隐藏:

[ParseChildren(true, "Content")]
[PersistChildren(false)]
public partial class NotPanel : System.Web.UI.UserControl
{   
    [PersistenceMode(PersistenceMode.InnerDefaultProperty)]
    public Control Content { get; set; }

    public void Page_Init(object sender, EventArgs e)
    {
        phControls.Controls.Add(Content);
    }
}

我是否对这个类的定义做错了,我不能使用代码块?或者这是UserControls的限制吗?

当文本框放置在其中一个控件中时,会发生相关问题(可能是由于相同原因) - 同一控件中<asp:CompareValidator>无法引用它,收到以下错误:

  

无法找到'compareValidator'的'ControlToCompare'属性引用的控件ID'txtCompareTo'。

同样,当<uc1:NotPanel>替换为<asp:Panel>时,此功能正常。有什么办法可以做到这一点吗?

2 个答案:

答案 0 :(得分:0)

据我所知(我很乐意纠正)你不能将这样的代码块注入用户控件。

用户控制基本上是迷你独立页面,通常与其父级隔离。而且它们不是名称可能暗示的实际自定义Web控件。

但是,您可以通过“属性”传递值。因此,在您的用户控件中,ascx.cs包含类似的内容:

private string _myImagePath;
public string MyImagePath
{
    get
    {
        return _myImagePath;
    }
    set
    {
        _myImagePath = value;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    //do stuff
}

然后你可以<uc1:NotPanel runat="server" MyImagePath="Foo" />

OR

ASPX中的

<uc1:NotPanel runat="server" ID="MyUserControl" /> 并在代码隐藏中:MyUserControl.MyImagePath = "Foo";

答案 1 :(得分:0)

这听起来很奇怪,但如果你在包含代码块的标记代码周围放置<asp:PlaceHolder>控件,运行时错误可能会消失。

但是,智能感知可能会有点抱怨。