@jdecuyper, один принцип, который я повторяю мне часто, "если Ваша бизнес-логика не находится в Вашей базе данных, это - только рекомендация". Я думаю, что Paul Nielson сказал это в одной из его книг. Прикладные уровни и UI приходят и уходят, но данные обычно живут в течение очень долгого времени.
, Как я избегаю объектов объекта? Хранимые процедуры главным образом. Я также свободно признаю, что бизнес-логика имеет тенденцию достигать через все слои в приложении, предназначаете ли Вы это к или нет. Определенное количество связи свойственно и неизбежно.
Вы в основном правы насчет синтаксиса <% = ...%>
.
Вот пример того, что происходит под капотом:
<script runat="server">
public string SomeProperty { get { return "Hello World!"; } }
</script>
<form id="form1" runat="server">
<%= SomeProperty %>
<div>
<asp:Label ID="Label1" runat="server" Text="<%= SomeProperty %>"></asp:Label>
</div>
</form>
Это анализируется, и создается следующий код C # (я немного упростил его):
private Label @__BuildControlLabel1()
{
Label @__ctrl = new Label();
this.Label1 = @__ctrl;
@__ctrl.ApplyStyleSheetSkin(this);
@__ctrl.ID = "Label1";
@__ctrl.Text = "<%= SomeProperty %>";
return @__ctrl;
}
private void @__Renderform1(HtmlTextWriter @__w, Control parameterContainer)
{
@__w.Write( SomeProperty );
@__w.Write("\r\n <div>\r\n ");
parameterContainer.Controls[0].RenderControl(@__w);
@__w.Write("\r\n </div>\r\n ");
}
Вот пример того, что происходит под капотом для <% # ...%>
синтаксис:
<script runat="server">
public string SomeProperty { get { return "Hello World!"; } }
protected void Page_Load(object sender, EventArgs e) { Label1.DataBind(); }
</script>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="<%# SomeProperty %>"></asp:Label>
</div>
</form>
Создает этот код:
private Label @__BuildControlLabel1()
{
Label @__ctrl = new Label();
this.Label1 = @__ctrl;
@__ctrl.ApplyStyleSheetSkin(this);
@__ctrl.ID = "Label1";
@__ctrl.DataBinding += new System.EventHandler(this.@__DataBindingLabel1);
return @__ctrl;
}
public void @__DataBindingLabel1(object sender, EventArgs e)
{
Label dataBindingExpressionBuilderTarget = ((Label)(sender));
Page Container = ((Page)(dataBindingExpressionBuilderTarget.BindingContainer));
dataBindingExpressionBuilderTarget.Text = System.Convert.ToString( SomeProperty , System.Globalization.CultureInfo.CurrentCulture);
}
Как видите, синтаксис <% = ...%>
может использоваться вне свойства серверного элемента управления для непосредственной визуализации возвращаемого значения. С другой стороны, синтаксис <% # ...%>
генерирует обработчик событий для события DataBinding метки. Это событие устанавливает для свойства метки значение SomeProperty. Событие DataBinding срабатывает при каждом вызове метода DataBind, поэтому я добавил этот вызов к событию Page_Load.
Надеюсь, это поможет вам понять разницу между ними.
Вы можете создать собственный ExpressionBuilder , чтобы использовать что-то вроде <% $ Code: SomeProperty%>