58

次のように、<%=whatever %> のようなサーバー タグを使用して runat="server" コントロールの可視性を設定する .NET Framework 4 プロジェクトで作業しています。

  <div id="MyId" runat="server" visible="<%=MyVisiblePropertyOnCodeBehind %>" >
    Content
  </div>

これはフレームワーク 4 で動作しますが、フレームワーク 3.5 プロジェクトでこれを使用しようとすると動作しないようです。これは Framework 4 のみの機能ですか? コードビハインドからの可視性を設定するための最もクールな (および .aspx 側の) 代替手段はありますか? 私は醜いものを使用しています:

    MiId.Visible = MyVisiblePropertyOnCodeBehind

前もって感謝します、

トム

[編集] 解決策:

私の問題と解決策を理解できるコメントをありがとう!

それは複数のことで私のせいでした。

VS2010 プロジェクトでは、<%= の代わりに <%# を使用していました

また、VS2010 プロジェクトでは、「Page」からではなく CustomPage クラスから継承されたページを使用していたことに気付きませんでした。 4.0 のみの機能。

ここで言ったように、次のマークアップがある場合:

  <div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
    Content
  </div>

コードビハインドに以下を追加して、機能させることができます。

    public bool  MyVisiblePropertyOnCodeBehind = true;
    protected void Page_Load(object sender, EventArgs e) {
        DataBind();
        // Or if you want only for one control, MyId.DataBind();             
    }

私が読んだように、この DataBind() はアプリケーションのパフォーマンスを低下させる可能性があります。どのくらいのアイデアを持っていますか?これは、大規模なプロジェクトで使用される「プロの」テクニックとして理解できますか?それとも避けるべきだと思いますか?

マークアップを読みやすく、1 つのビューで理解しやすくする方法が気に入っていますが、遅いコードで罪を犯したくはありません。

4

5 に答える 5

80

投稿したコードは、ASP.NET 2.0 または ASP.NET 4.0 ランタイムのサーバー タグの有効な構文ではありません。<%= ... %>どちらのバージョンでも、server タグを使用して visible プロパティを設定しようとすると、パーサー エラーが発生します。

パーサー エラー メッセージ: 'Visible' プロパティの文字列表現 '<%=MyVisiblePropertyOnCodeBehind%>' から 'System.Boolean' 型のオブジェクトを作成できません。

コードビハインドまたはタグVisibleでプロパティを設定する以外に、2 つのオプションがあります。1 つ目は、プロパティ<script runat="server">でデータバインディングを使用することです。値をバインドするには、親コントロールのいずれかまたは 1 つでメソッドVisibleを呼び出す必要があります。DataBind()MyId

<div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
    Content
</div>

もう 1 つのオプションは、次のようにコードを記述することです。

<% if(MyVisiblePropertyOnCodeBehind) { %>
<div id="MyId" runat="server">
    Content
</div>
<% } %>

この方法の欠点は、コード ブロックを含むページまたはコントロールにプログラムでコントロールを追加できないことです。しようとすると、エラーが発生するはずです。

コントロールにコード ブロック (つまり <% ... %>) が含まれているため、Controls コレクションを変更できません。

そうは言っても、現在行っている方法でプロパティを設定するだけでよいと思います。

于 2012-03-07T06:53:03.450 に答える
3

ASP.NETはaspxページのインライン表現。<% %> は、aspx ページまたはユーザー コントロールのトップ ドキュメント レベルでのみ使用できますが、サーバー コントロールのタグ属性 ( など <asp:Button... Text =<% %> ..>) に埋め込むことはできません。お気づきのように、ASP.NET 2.0 でカスタム式ビルダーを作成して、インライン式を追加できます。

ところで、aspx インライン テンプレートでサーバー コントロール プロパティに値を提供する別の方法は、<%# %> データバインディング式を使用することです。これは組み込みでサポートされています。他のインライン式との唯一の違いは、ターゲット コントロールまたはそのコンテナー コントロールのメソッドです。

スティーブン・チェン

Microsoft MSDN オンライン サポート リード

完全な投稿はこちら: http://www.aspnet-answers.com/microsoft/ASP-NET/29389067/dynamically-set-a-control-property.aspx

ここでの回避策: ASP.net インライン式の問題

于 2012-03-07T06:45:55.980 に答える
2

元の質問のコードの単純さを維持する別のアプローチを次に示します。ここでは、runat="server" を div タグから削除し、"Visible" プロパティの代わりに css "display:none" を使用する必要があります。このアプローチの欠点は、タグが表示されていなくても、タグがブラウザに送信され、可視性がクライアント側で処理されることです。

<div style='<%=MyVisiblePropertyOnCodeBehind ? "" : "display: none" %>' >
    Content
</div>
于 2013-10-22T09:35:14.163 に答える
2

このように、pageLoad イベントで変数を true/false に設定するだけです

private bool IsEditMode {get; set;}      

protected bool IsVisible 
{
    get { retun IsEditMode ;}
    set { IsEditMode =value;}
}  

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // based on some condition set this to true or false 
        isEditMode=true;
    }
}   

次に、aspx ページ内のコントロール プロパティで、次のようなプロパティを介して可視性を設定します。

Visible="<%# !IsEditMode %>" 
于 2012-03-07T07:43:48.260 に答える
0

もう 1 つの方法は、コントロールに ID を与え、コードで表示を設定することです。

protected void Page_Load(object sender, EventArgs e){
   MyId.Visible = MyVisiblePropertyOnCodeBehind;
} 

<div id="MyId" runat="server">Content</div>
于 2020-11-02T09:49:49.643 に答える