web-dev-qa-db-ja.com

ASP.NETのマークアップからクラスの背後にあるコードのプロパティにアクセスするための最良の方法

これは本当にばかげた質問かもしれませんが、私は.NETを学んでいるので、まったく無知です...

2つのファイルdefault.aspxと関連するdefault.aspx.csがあるとしましょう。

default.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    var myObject = new MyObject();
}

Default.aspxで次のようなことができる方法はありますか?

<%= myObject.SomePropertyOfThisObject%>

...または同様の何か、データバインダーまたはこのような複雑なものを使用する必要はありませんか?そして、データをバインドする方法がない場合、それを行うための最良の方法は何でしょうか?

18
marcgg

できますが、少し違う方法で行う必要があります。 default.aspx.csに、メンバーを追加します。

protected MyObject _myObject;

次に、Page_Loadで:

protected void Page_Load(object sender, EventArgs e)
{
         _myObject = new MyObject();
}

次に、default.aspxで、次のことができます。

<%= _myObject.SomePropertyOfThisObject %>

もちろん、これはクラスMyObjectにAwesomeという名前のプロパティがあることを前提としています。 Awesomeという名前のプロパティがないため、System.Objectクラスを意味するのではありません。


あなたの質問はbestの方法について尋ねていたので、私はさらに進みます。私が示した方法は最高ではありません。より頻繁にデータバインディング式を使用するのが最善です。それらが気に入らない場合は、コードビハインドで設定できます。

protected void Page_Load(object sender, EventArgs e)
{
         _myObject = new MyObject();
        //
        _myLabel.Text = _myObject.SomePropertyOfThisObject;
}

仮定:

<asp:Label runat="server" id="_myLabel" />
31
John Saunders

<%= ...%>は、Response.Write( .... )のASPX省略形です。

MyObjectを(Objectとしての型だけでなく)厳密に型に変更する場合は、次の行を使用できます。

<%= myObject.Awesome %>

値を出す。

ただし、<%=構文には制限があることに注意してください。具体的には次のとおりです。

  • hTML属性内で値として使用することはできません
  • サーバー側の要素を放出することはできません
  • ASP UpdatePanels内では使用できません-部分的なポストバックを実行すると例外が発生します

ページにLabelコントロールを作成し、プログラムでTextプロパティを値に設定することをお勧めします。これにより、値から文字列への変換の実行方法をより細かく制御することもできます。また、更新パネルのコントロールで正しく機能します。

6
LBushkin

コードビハインドを使用するのではなく、ASPXファイルで直接実行したい任意のコーディングを実行できます。だから、私があなたがやりたいと思うことを達成するために、あなたは持っているでしょう...

<some html>

<% var MyObject = new MyObject();
   Response.Write(myObj.Awesome()); %>

<some html>

ただし、これは実際には推奨されません。 Codebehindは、コードをマークアップから分離するため、推奨される「ベストプラクティス」の方法です。これは、優れたアーキテクチャの基本です。データバインディングを回避するために、John Saundersが投稿したようなものを使用することをお勧めしますが、オブジェクトのプロパティをHTMLに直接出力するのではなく、ライフサイクルイベントを使用してコードビハインドでコントロールを操作することを検討する必要があります。たとえば、テキストを出力しようとした場合は、次のようにします。

var literal = new LiteralControl(myObject.Awesome());
myPanel.Controls.Add(literal);
1
womp

コードビハインド(.cs)で変数を保護されていると宣言し、aspxページでそれを呼び出してすべてのデータを取得できます。

例えば.

_protected IEnumerable<Class> _mydata;

internal void MyDefaultData()
{
mydata = doallthework;
}
_

aspxページでは、次のように行うことができます

<%=_mydata.FirstOrDefault().FirstName%>

ロード時にメソッドが呼び出されることを確認してください。

1
Sher Abbas

その範囲でアクセスできるようにするには、公開する必要はありませんか?

..

public var myObject = null;
protected void Page_Load(object sender, EventArgs e)
{
  myObject = new Object();
}
0
Robin