2

我感到羞愧,我做错了什么,我不知道它是什么。有人来帮忙吗?如果是这样,请提前致谢!

我正在尝试从 ASP 用户控件的 GAC 中的继承代码中读取属性。UserControl 中的 CodeBehind 是:

namespace My.Name.Space
{
    public class MyControl : UserControl
    {
        public String SomeString { get; set; }
        public Boolean MyProperty
        {
            get
            {
                if (String.Equals(SomeString,"SomeValue"))
                    return true;
                return false;
            }
        }

        // other code
    }
}

ascx 看起来像这样:

<%@ Control ClassName="MyControl" Language="C#" Inherits="My.Name.Space.MyControl, MyDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxxx" %>
<asp:DropDownList runat="server" id="myId" Visible='<%# Eval("MyProperty") %>' />

控件硬连接到一个 Aspx 页面,但 SomeString 属性不是在 aspx 中设置的!SomeString 属性在 Aspx 页面的 OnLoad 中设置。

知道我的代码有什么问题吗?再次感谢!

编辑:我也试过<asp:Label Text='<% Eval("MyProperty") %>' />,同样的错误(发生了意外错误。)

4

2 回答 2

1

要在标准标记(外部绑定控件)中使用 <%# %> 语法 - 您必须在用户控件或页面本身上调用 DataBind()。

于 2012-06-06T09:45:41.560 回答
1

Eval 代码块与数据绑定控件一起使用,但也会在调用 this.DataBind() 时进行评估。

但是,您不需要使用 Eval(实际上您不能使用用户控件),因为此构造由 ASP .Net 转换为DataBinder.Eval(someObject, "SomePropertyOfAnObject")采用 someObject 并通过反射获取SomePropertyOfAnObject属性的值。DataBinding 控件有一个 DataSource 属性,该属性是要评估的对象的集合。使用用户控件并非如此。

您仍然可以使用<%# %>, 但通过以下方式:

<asp:DropDownList runat="server" id="myId" Visible='<%# MyProperty %>' />

ASP .Net 将生成如下内容:

dataBindingExpressionBuilderTarget.Visible = ((bool)( MyProperty ));

这意味着如果您将来改变主意,MyProperty 至少应该受到保护。

于 2012-06-06T09:57:56.727 回答