Вопрос по asp.net, c# – Лучший способ получить доступ к свойствам моего кода за классом из разметки в ASP.NET

18

This might be a really dumb question but I'm learning .NET, so I'm quite clueless...

Допустим, у меня есть два файла default.aspx и связанный с ним default.aspx.cs.

Default.aspx.cs:

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

Есть ли способ, что в default.aspx я мог бы сделать что-то вроде:

<%= myObject.SomePropertyOfThisObject%>

... или что-то подобное, без необходимости использовать базы данных или что-то сложное, как это? И если нет способа обвязать данные, что будет лучшим способом сделать это?

@Joel: это действительно лучше практиковать, чтобы сделать это? Иногда это просто делает мой код намного более сложным и запутанным (добавляя буквально и обновляя его, когда я могу просто получить доступ к объекту) ... marcgg
Я не совсем понимаю, что вы пытаетесь сделать ... sebagomez
Это как бы назад для веб-форм. Избавьтесь от привычки помещать такую логику в свой код APSX. Вместо этого добавьте метку или буквальный элемент управления. Joel Coehoorn
Подумайте с точки зрения HTML, который вы пытаетесь сгенерировать, а затем решите. Но учтите, что элемент управления может быть позже стилизован. Это не просто текстовая строка, сплат, прямо здесь. John Saunders
определение объекта в моем .cs и использование его в моем .aspx marcgg

Ваш Ответ

5   ответов
30

Вы можете, но вам придется сделать это немного по-другому. В вашем 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.


Так как ваш вопрос спрашивал оbest Кстати, я пойду дальше. Способ, который я показал, не самый лучший. Лучше всего чаще использовать выражение привязки данных. Если вам это не нравится, вы можете установить код в коде:

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

Предполагая, что:

<asp:Label runat="server" id="_myLabel" />
5

& Lt;% = ...% & gt; ASPX сокращение дляResponse.Write( .... ).

Если вы измените myObject на строго типы (а не просто типы как Object), вы можете использовать строку:

<%= myObject.Awesome %>

излучать стоимость.

Однако учтите, что синтаксис & lt;% = имеет ограничения, а именно:

  • it cannot be used within HTML attribute as a value
  • it cannot emit server-side elements
  • it cannot be used within ASP UpdatePanels - you will get a exception when you perform a partial postback

Возможно, вам лучше создать элемент управления Label на своей странице и программно настроитьText свойство к стоимости. Это также дает вам больше контроля над тем, как выполняются преобразования значения в строку. И будет работать правильно с обновлением панели управления.

1

Вы можете объявить переменную как защищенную в коде (.cs), а затем вызвать ее на странице aspx, чтобы получить все данные.

например

protected IEnumerable<Class> _mydata;

internal void MyDefaultData()
{
mydata = doallthework;
}

на странице aspx вы можете сделать как следующие

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

Убедитесь, что метод вызывается при загрузке.

1

Вы можете делать любое кодирование, которое хотели бы сделать непосредственно в файле 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);
0

Разве это не должно быть публично, чтобы быть доступным в этом объеме?

..

public var myObject = null;
protected void Page_Load(object sender, EventArgs e)
{
  myObject = new Object();
}
достаточно защиты (те же требования, что и у Page_Load)

Похожие вопросы