Часть проблемы с этим видом функциональности - то, что часто это требует variadic макросов. Они были стандартизированы справедливо недавно (C99), и много старых компиляторов C не поддерживает стандарт или имеет их собственную специальную работу вокруг.
Ниже заголовок отладки, я записал, что это имеет несколько замечательных функций:
Примечание: По некоторым причинам у меня были некоторые небольшие проблемы форматирования кода.
#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_ */
Можно, но вы приходиться делать это немного иначе. В свой 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" />
Вы можете выполнять любое кодирование, которое хотите, непосредственно в файле 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);
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:
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.
Разве он не должен быть общедоступным, чтобы быть доступным в этой области?
..
public var myObject = null;
protected void Page_Load(object sender, EventArgs e)
{
myObject = new Object();
}