从ASP.NET中的标记访问类后面的代码属性的最佳方法

mar*_*cgg 18 c# asp.net scope

这可能是一个非常愚蠢的问题,但我正在学习.NET,所以我很无能......

假设我有两个文件default.aspx和关联的default.aspx.cs.

default.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    var myObject = new MyObject();
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在default.aspx中我可以做类似的事情:

<%= myObject.SomePropertyOfThisObject%>
Run Code Online (Sandbox Code Playgroud)

...或者类似的东西,而不必使用数据移动器或像这样复杂的东西?如果没有办法约束数据,那么最好的方法是什么?

Joh*_*ers 31

你可以,但你必须有点不同.在default.aspx.cs中,添加一个成员:

protected MyObject _myObject;
Run Code Online (Sandbox Code Playgroud)

然后,在Page_Load中:

protected void Page_Load(object sender, EventArgs e)
{
         _myObject = new MyObject();
}
Run Code Online (Sandbox Code Playgroud)

然后,在default.aspx中,您可以执行以下操作:

<%= _myObject.SomePropertyOfThisObject %>
Run Code Online (Sandbox Code Playgroud)

当然,这假设类MyObject具有名为Awesome的属性.你不是指System.Object类,因为它没有名为Awesome的属性.


既然你的问题是询问最好的方法,我会更进一步.我展示的方式不是最好的.最好的方法是使用数据绑定表达式.如果您不喜欢这些,那么您可以在代码隐藏中设置内容:

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

假设:

<asp:Label runat="server" id="_myLabel" />
Run Code Online (Sandbox Code Playgroud)


LBu*_*kin 6

<%= ...%>是ASPX的简称Response.Write( .... ).

如果将myObject更改为强类型(而不仅仅是类型为Object),则可以使用该行:

<%= myObject.Awesome %>
Run Code Online (Sandbox Code Playgroud)

发出一个值.

但请注意,<%=语法有局限性 - 具体来说:

  • 它不能在HTML属性中用作值
  • 它不能发出服务器端元素
  • 它不能在ASP UpdatePanel中使用 - 执行部分回发时会出现异常

您最好在页面上创建Label控件,并以编程方式将Text属性设置为值.这也使您可以更好地控制如何执行值到字符串的转换.并将与更新面板控件正常工作.