Лучший способ получить доступ к свойствам моего кода за классом из разметки в 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 я мог бы сделать что-то вроде:
<%= myObject.SomePropertyOfThisObject%>
... или что-то подобное, без необходимости использовать databinders или что-то сложное, как это? И если нет способа привязать данные, что было бы лучшим способом сделать это?
Ответы
Ответ 1
Вы можете, но вам придется поступить иначе. В файле 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;
}
Предполагая, что:
<asp:Label runat="server" id="_myLabel" />
Ответ 2
<% =...% > является короткой командой ASPX для Response.Write( .... )
.
Если вы меняете myObject на сильно типы (а не просто на объекты как Object), вы можете использовать строку:
<%= myObject.Awesome %>
чтобы исправить значение.
Помните, однако, что синтаксис <% = имеет ограничения - в частности:
- он не может использоваться в атрибуте HTML как значение
- он не может выделять элементы на стороне сервера.
- он не может использоваться в ASP UpdatePanels - вы получите исключение, если вы выполните частичную обратную передачу
Вероятно, вам лучше создать элемент управления Label на вашей странице и программно установить для свойства Text
значение. Это также дает вам больше контроля над тем, как выполняется преобразование значений в строку. И будет корректно работать с элементами панели управления обновлением.
Ответ 3
Вы можете сделать любое кодирование, которое вы хотели бы сделать непосредственно в файле ASPX, вместо того, чтобы использовать codebehind. Итак, чтобы выполнить то, что, я думаю, вы хотите сделать, у вас было бы...
<some html>
<% var MyObject = new MyObject();
Response.Write(myObj.Awesome()); %>
<some html>
Однако это действительно не рекомендуется. Codebehind - это предлагаемый способ "наилучшей практики", потому что это отделяет ваш код от вашей разметки, что является фундаментальным в любой хорошей архитектуре. Я бы рекомендовал использовать что-то вроде того, что написал Джон Сондерс, чтобы избежать привязки данных, но вы должны действительно рассмотреть возможность манипулирования своими элементами управления в коде, используя события жизненного цикла, а не выводить свойства объекта непосредственно в свой HTML. Например, если вы пытались вывести какой-то текст, тогда сделайте что-то вроде
var literal = new LiteralControl(myObject.Awesome());
myPanel.Controls.Add(literal);
Ответ 4
Вы можете объявить переменную как защищенную в коде позади (.cs), а затем вызвать это на странице aspx для извлечения всех данных.
например.
protected IEnumerable<Class> _mydata;
internal void MyDefaultData()
{
mydata = doallthework;
}
на странице aspx вы можете сделать следующее:
<%=_mydata.FirstOrDefault().FirstName%>
Убедитесь, что метод вызван при загрузке.
Ответ 5
Не должно ли оно быть общедоступным, чтобы быть доступным в этой области?
..
public var myObject = null;
protected void Page_Load(object sender, EventArgs e)
{
myObject = new Object();
}