从ASP.NET标记中访问我代码后台类的属性的最佳方法是什么?

19

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

default.aspx.cs:

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

default.aspx 中有没有一种方法可以做到这样:

<%= myObject.SomePropertyOfThisObject%>

是否有一种简单的方法可以使用类似于 ... 的方式来显示数据,而不必使用数据绑定或像这样复杂的东西?如果没有绕过数据绑定的方法,那么最好的方法是什么?


我不太明白你想做什么... - sebagomez
在我的 .cs 文件中定义一个对象,并在我的 .aspx 文件中使用它。 - marcgg
这对于Web表单来说有点反向。不要习惯于在aspx代码中放置那种逻辑。相反,添加一个标签或文字控件。 - Joel Coehoorn
控件也可以单独缓存,因此如果在生成该控件时需要大量工作,您可以将其保存以供将来查看。 - Joel Coehoorn
@joel 缓存细节也很有趣。虽然它并不适用于这个页面,因为它非常简单,但我会记在心里的。 - marcgg
显示剩余5条评论
5个回答

33
你可以这样做,但需要稍微改变一下方式。在你的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的属性。你不是指System.Object类,因为它没有名为Awesome的属性。
由于你的问题是关于最佳方式的,我将进一步解释。我展示的方法并不是最好的,更好的方法通常是使用数据绑定表达式。如果您不喜欢这些表达式,那么可以在codebehind中设置这些内容。
protected void Page_Load(object sender, EventArgs e)
{
         _myObject = new MyObject();
        //
        _myLabel.Text = _myObject.SomePropertyOfThisObject;
}
假设:
<asp:Label runat="server" id="_myLabel" />

6

<%= ... %>是ASPX中Response.Write( .... )的简写。

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

<%= myObject.Awesome %>

发出一个值。

然而,请注意,<%= 语法有其限制 - 具体来说:

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

你最好在页面上创建一个 Label 控件,并以编程方式设置 Text 属性的值。这也可以让你更好地控制值到字符串的转换方式。并且能够正确地与更新面板控件一起工作。


1

它不是必须公开才能在该范围内访问吗?

..

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

2
受保护的访问修饰符足够了(与Page_Load具有相同的要求) - Frank Schwieterman

1

您可以直接在ASPX文件中进行任何想要的编码,而不是使用codebehind。因此,为了实现我认为您想要做的事情,您可以...

<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
你可以在代码后端(.cs)中声明变量为protected,然后在aspx页面上调用它来检索所有数据。
例如:
protected IEnumerable<Class> _mydata;

internal void MyDefaultData()
{
mydata = doallthework;
}

在aspx页面上,您可以像以下方式执行操作:

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

确保在加载时调用该方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接