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 に設定されていません! Aspx ページの OnLoad で SomeString プロパティが設定されます。

私のコードの問題点は何ですか? もう一度ありがとう!

編集:私も試し<asp:Label Text='<% Eval("MyProperty") %>' />ました、同じエラー(予期しないエラーが発生しました。)

4

2 に答える 2

1

Evalコードブロックはデータバインディングコントロールで使用されますが、this.DataBind()が呼び出されたときにも評価されます。

ただし、この構造はASP .NetによってsomeObjectを取得し、リフレクションを介してSomePropertyOfAnObjectプロパティDataBinder.Eval(someObject, "SomePropertyOfAnObject")の値を取得するようなものに変換されるため、Evalを使用する必要はありません(実際にはユーザーコントロールでは使用できません) 。DataBindingコントロールには、評価されるオブジェクトのコレクションであるDataSourceプロパティがあります。ユーザーコントロールではそうではありません。

は引き続き使用できますが<%# %>、次のようになります。

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

ASP .Netは、次のようなものを生成します。

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

つまり、将来気が変わった場合に備えて、MyPropertyは少なくとも保護する必要があります。

于 2012-06-06T09:57:56.727 に答える
1

標準マークアップ (バインドされたコントロールの外側) で <%# %> 構文を使用するには、ユーザー コントロールまたはページ自体で DataBind() を呼び出す必要があります。

于 2012-06-06T09:45:41.560 に答える