Подтвердить что ты не робот

Лучший способ получить доступ к свойствам моего кода за классом из разметки в 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 или что-то сложное, как это? И если нет способа привязать данные, что было бы лучшим способом сделать это?

4b9b3361

Ответ 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();
}