从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(); }