私は、次のようなrunat = "server"コントロールの可視性を設定するために<%= whatever%>のようなサーバータグを使用して.NET Framework 4プロジェクトに取り組んできました。
<div id="MyId" runat="server" visible="<%=MyVisiblePropertyOnCodeBehind %>" >
Content
</div>
これはフレームワーク4で機能しますが、Framework 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つのビューで読みやすく理解しやすくする方法が気に入っていますが、遅いコードの罪を犯したくはありません。
投稿したコードは、ASP.NET 2.0またはASP.NET 4.0ランタイムのサーバータグの有効な構文ではありません。どちらのバージョンでも、サーバータグで_<%= ... %>
_を使用して可視プロパティを設定しようとすると、パーサーエラーが発生します。
パーサーエラーメッセージ:「Visible」プロパティの文字列表現「<%= MyVisiblePropertyOnCodeBehind%>」からタイプ「System.Boolean」のオブジェクトを作成できません。
Codebehindまたは_<script runat="server">
_タグでVisible
プロパティを設定する以外に2つのオプションがあります。 1つは、Visible
プロパティでデータバインディングを使用することです。値をバインドするには、MyId
またはその親コントロールのいずれかでDataBind()
メソッドを呼び出す必要があります。
_<div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
Content
</div>
_
もう1つのオプションは、次のようにコードを記述することです。
_<% if(MyVisiblePropertyOnCodeBehind) { %>
<div id="MyId" runat="server">
Content
</div>
<% } %>
_
このアプローチの欠点は、コードブロックを含むページまたはコントロールにプログラムでコントロールを追加できないことです。あなたがしようとすると、エラーが発生するはずです:
コントロールにコードブロック(<%...%>)が含まれているため、Controlsコレクションを変更できません
言われていることはすべて、あなたが今しているようにプロパティを設定するだけで行くと思います。
ASP.NET aspxページのインライン式に関しては。 <%%>は、aspxページまたはユーザーコントロールのトップドキュメントレベルでのみ使用できますが、サーバーコントロールのタグ属性(
<asp:Button... Text =<% %> ..>
など)に埋め込むことはできません。 ASP.NET 2.0でカスタム式ビルダーを作成して、インライン式を追加できます。ところで、aspxインラインtempalteのサーバーコントロールプロパティに値を提供する別の手段は、<%#%>データバインディング式を使用しています。これは組み込みでサポートされています。他のインライン式と異なるのは、ターゲットコントロールまたはそのコンテナコントロール上のメソッドのみです。
スティーブン・チェン
Microsoft MSDNオンラインサポートリード
完全な投稿はこちら: http://www.aspnet-answers.com/Microsoft/ASP-NET/29389067/dynamically-set-a-control-property.aspx
ここでの回避策: ASP.net Inline Expression Issue
このように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 %>"
元の質問からのコードの単純さを維持する別のアプローチがあります。ここでは、divタグからrunat = "server"を削除し、 "Visible"プロパティの代わりにcss "display:none"を使用する必要があります。このアプローチの欠点は、タグが表示されていなくてもタグがブラウザに送信され、クライアント側で表示が処理されることです。
<div style='<%=MyVisiblePropertyOnCodeBehind ? "" : "display: none" %>' >
Content
</div>