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

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

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

default.aspx.cs:

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

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

  

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

你可以,但你必须有所不同。 在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的属性。


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

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

假设:

  

对于Response.Write( .... ) ,<%= ...%>是ASPX的简写。

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

 <%= myObject.Awesome %> 

发出一个值。

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

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

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

您可以直接在ASPX文件中执行任何编码,而不是使用代码隐藏。 所以,为了实现我想你想做的事,你会……

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

但是,这确实不推荐。 Codebehind是建议的“最佳实践”方式,因为它将您的代码与标记分开,这是任何优秀架构的基础。 我建议使用John Saunders发布的内容以避免数据绑定,但您应该考虑使用生命周期事件在代码隐藏中操作控件,而不是直接将对象属性输出到HTML。 例如,如果您尝试输出一些文本,那么执行类似的操作

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

您可以在后面的代码中声明变量为受保护的(.cs),然后在aspx页面上调用该变量来检索所有数据。

例如

 protected IEnumerable _mydata; internal void MyDefaultData() { mydata = doallthework; } 

在aspx页面上你可以这样做

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

确保在加载时调用方法。

是否必须公开才能在该范围内访问?

..

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