Лучший способ получить доступ к свойствам моего кода позади класса от разметки в ASP.NET

Часть проблемы с этим видом функциональности - то, что часто это требует variadic макросов. Они были стандартизированы справедливо недавно (C99), и много старых компиляторов C не поддерживает стандарт или имеет их собственную специальную работу вокруг.

Ниже заголовок отладки, я записал, что это имеет несколько замечательных функций:

  • Поддержки C99 и синтаксис C89 для макросов отладки
  • Позволяют/Запрещают вывод на основе Вывода аргумента функции
  • к дескриптору файла (файл io)

Примечание: По некоторым причинам у меня были некоторые небольшие проблемы форматирования кода.

#ifndef _DEBUG_H_
#define _DEBUG_H_
#if HAVE_CONFIG_H
#include "config.h"
#endif

#include "stdarg.h"
#include "stdio.h"

#define ENABLE 1
#define DISABLE 0

extern FILE* debug_fd;

int debug_file_init(char *file);
int debug_file_close(void);

#if HAVE_C99
#define PRINT(x, format, ...) \
if ( x ) { \
if ( debug_fd != NULL ) { \
fprintf(debug_fd, format, ##__VA_ARGS__); \
} \
else { \
fprintf(stdout, format, ##__VA_ARGS__); \
} \
}
#else
void PRINT(int enable, char *fmt, ...);
#endif

#if _DEBUG
#if HAVE_C99
#define DEBUG(x, format, ...) \
if ( x ) { \
if ( debug_fd != NULL ) { \
fprintf(debug_fd, "%s : %d " format, __FILE__, __LINE__, ##__VA_ARGS__); \
} \
else { \
fprintf(stderr, "%s : %d " format, __FILE__, __LINE__, ##__VA_ARGS__); \
} \
}

#define DEBUGPRINT(x, format, ...) \
if ( x ) { \
if ( debug_fd != NULL ) { \
fprintf(debug_fd, format, ##__VA_ARGS__); \
} \
else { \
fprintf(stderr, format, ##__VA_ARGS__); \
} \
}
#else /* HAVE_C99 */

void DEBUG(int enable, char *fmt, ...);
void DEBUGPRINT(int enable, char *fmt, ...);

#endif /* HAVE_C99 */
#else /* _DEBUG */
#define DEBUG(x, format, ...)
#define DEBUGPRINT(x, format, ...)
#endif /* _DEBUG */

#endif /* _DEBUG_H_ */
18
задан marcgg 11 July 2013 в 13:11
поделиться

4 ответа

Можно, но вы приходиться делать это немного иначе. В свой 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" />
31
ответ дан 30 November 2019 в 07:13
поделиться

Вы можете выполнять любое кодирование, которое хотите, непосредственно в файле ASPX, а не использовать программный код. Итак, чтобы выполнить то, что, я думаю, вы хотите сделать, вам нужно ...

<some html>

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

<some html>

Однако это действительно не рекомендуется. Codebehind - это рекомендуемый «лучший метод», потому что он отделяет ваш код от разметки, что является основополагающим в любой хорошей архитектуре. Я бы рекомендовал использовать что-то вроде того, что опубликовал Джон Сондерс, чтобы избежать привязки данных, но вам действительно следует подумать о том, чтобы манипулировать своими элементами управления в коде позади, используя события жизненного цикла, а не выводить свойства объекта непосредственно в ваш HTML. Например, если вы пытались вывести какой-то текст, сделайте что-то вроде

var literal = new LiteralControl(myObject.Awesome());
myPanel.Controls.Add(literal);
1
ответ дан 30 November 2019 в 07:13
поделиться

The <%= ... %> is ASPX short-hand for Response.Write( .... ).

If you change myObject to be strongly types (rather than just types as Object) you can certain use the line:

<%= myObject.Awesome %>

to emit a value.

Be aware, however, that the <%= syntax has limitations - specifically:

  • 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

You are probably better off creating a Label control on you page, and programmatically setting the Text property to the value. This also gives you more control over how value-to-string conversions are performed. And will work correctly with update panel controls.

6
ответ дан 30 November 2019 в 07:13
поделиться

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

..

public var myObject = null;
protected void Page_Load(object sender, EventArgs e)
{
  myObject = new Object();
}
0
ответ дан 30 November 2019 в 07:13
поделиться
Другие вопросы по тегам:

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