Там какой-либо путь состоит в том, чтобы декларативно передать код - позади значений свойств к управлению сервером?

@jdecuyper, один принцип, который я повторяю мне часто, "если Ваша бизнес-логика не находится в Вашей базе данных, это - только рекомендация". Я думаю, что Paul Nielson сказал это в одной из его книг. Прикладные уровни и UI приходят и уходят, но данные обычно живут в течение очень долгого времени.

, Как я избегаю объектов объекта? Хранимые процедуры главным образом. Я также свободно признаю, что бизнес-логика имеет тенденцию достигать через все слои в приложении, предназначаете ли Вы это к или нет. Определенное количество связи свойственно и неизбежно.

9
задан Andy McCluggage 13 August 2009 в 10:29
поделиться

2 ответа

Вы в основном правы насчет синтаксиса <% = ...%> . Вот пример того, что происходит под капотом:

<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.
Надеюсь, это поможет вам понять разницу между ними.

7
ответ дан 4 December 2019 в 21:11
поделиться

Вы можете создать собственный ExpressionBuilder , чтобы использовать что-то вроде <% $ Code: SomeProperty%>

3
ответ дан 4 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

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