1

在 WebFormsMvp 页面中从 View 到 Presenter 获取业务对象的多个属性值的最佳方法是什么?

请记住 DataSources 的这个问题。

这是我的建议:

场景是,我有一个名为 Quote 的业务对象,我想从数据库中加载,编辑然后保存。Quote 类上有很多属性。该表单涉及其中大约 20 个属性。我有现有的方法来向/从数据库加载/保存 Quote 对象。我现在需要将这一切连接在一起。

所以,在我的演示者的 View_Load 处理程序中,我打算做这样的事情:

public void View_Load(object sender, EventArgs e)
{
    View.Model.Quote = quoteService.Read(quoteId);
}

然后按如下方式绑定我的所有控件:

<asp:TextBox ID="TotalPriceTextBox" runat="server"
    Text="<%# Model.Quote.TotalPrice %>" />

一切都好,数据在屏幕上。

然后用户进行大量更改并点击“提交”按钮。这是我不确定的地方。

我创建了一个名为 QuoteEventArgs 的类,公开了表单能够编辑的 20 个属性。当视图引发提交按钮的事件时,我将这些属性设置为后面代码中控件的值。然后引发事件以供演示者响应。演示者从数据库中重新加载 Quote 对象,设置所有属性并将其保存到数据库中。

这是正确的方法吗?如果不是,那是什么?

4

2 回答 2

1

“更好的方式”(/alternative)是利用2-way binding,因此将传递回 Presenter 进行处理的将是您的Quote对象。

这可以通过将asp:FormView与指定UpdateMethodBind()方法的mvp:PageDataSource结合使用来实现。

WebFormsMVP 示例项目通过“EditWidgetControl”演示了这一点,包括查看代码隐藏文件所需的方法。

作为一个选项,您的视图可以简单地为asp:FormView实现EditItemTemplate ,在FormView上使用DefaultMode="Edit"

样本结构:

<asp:FormView DataSourceID="theSource" DefaultMode="Edit">
    <EditItemTemplate>
        <fieldset>
            <asp:TextBox id="totp" value='<%# Bind("TotalPrice") %>' runat="server" />
        </fieldset>
    </EditItemTemplate>
</asp:FormView>

<mvp:PageDataSource ID="theSource" runat="server"
    DataObjectTypeName="Your.NameSpace.Quote"
    UpdateMethod="UpdateQuote">
</mvp:PageDataSource>

代码隐藏:

public void UpdateQuote(Quote q, Quote ori)
{
    OnUpdatingQuote(q, ori);
}

public event EventHandler<UpdateQuoteEventArgs> UpdatingQuote;

private void OnUpdatingQuote(Quote q, Quote ori)
{
   if (UpdatingUserGroup != null)
   {
       UpdatingUserGroup(this, new UpdateQuoteEventArgs(q, ori));
   }
}
于 2010-06-22T07:08:44.787 回答
0

如何在 FormView 中使用 GridView。因为我有列表来填充实体中的网格。

于 2013-07-08T12:35:08.193 回答