使用ObjectDataSource和FormView的多字段提交的解决方案

问题:           试想一个表单有100个字段,那么这个表单的显示(read)两层架构要从DataReader到textBox.text 或label.text要100次付值。如果采用三层架构,也是同样的。从Model到UI也要100次付值。而这期间都要小心处理。而UPDate和Create的过程从UI到Model也都要100次付值。这些付值的过程都要手工去写,并且都在一个页面内小心处理。这无疑和UI层的概念背道而弛。

解决方案:

  • objectdatasource设置要点:        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server"  DeleteMethod="Delete" InsertMethod="Add" SelectMethod="GetMaxModel" TypeName="BLL.test" UpdateMethod="Update" OldValuesParameterFormatString="{0}" ConflictDetection="OverwriteChanges"  DataObjectTypeName="Model.test"> </asp:ObjectDataSource>设置了DataObjectTypeName以后selectMethod返回的是Model.test类型,Delete的签名必须是Delete(Model.test XXX),Update签名是Update(Model.test XXX)否则会报非泛型的错误。
  • FormView的设置如下:         版面可自由设置。简单的可以在前台直接绑定。复杂的可以在本身控件的DataBound的时候做到, 例如     protected void ddlYear_DataBound(object sender, EventArgs e)
        {
            //首先从dataItem中得到他应该的值,
                             Model.test ob1 = this.FormView1.DataItem as  Model.test;
            DropDownList ddlYear = ((DropDownList)sender);

            for (int i = 1949; i <= System.DateTime.Now.Year; i++)
            {
                ddlYear.Items.Add(new ListItem(i.ToString(), i.ToString()));
            }
            ddlYear.SelectedValue = ob1.birthday.Year.ToString();
                     }                                                                                                   protected void FormView1_ItemUpdating(object sender, FormViewUpdateEventArgs e)
        {       
           string year=((DropDownList)(this.FormView1.FindControl("ddlYear"))).SelectedValue;//不必钻进去找控件
           string month = ((DropDownList)(this.FormView1.FindControl("ddlMonth"))).SelectedValue;//不必钻进去找控件
           string day = ((DropDownList)(this.FormView1.FindControl("ddlDay"))).SelectedValue;//不必钻进去找控件
           e.NewValues["birthday"] = year+"-"+month+"-"+day; //assuming the second value being updated is
           e.Cancel = false;
        }
  • 前台的页面绑定自然不是一个个手工做的。而是在绑定到ObjectDataSource的时候自动生成的。大部分是不需要改的。少数是需要换用其它控件的。版面有点难改,但这不是问题。即使是用传统的方式也是需要调整版面的。
  • 针对我现在遇到的情景:我们是不需要ItemTemplate的,要把ItemTemplate去掉,New按钮是不写在EditTemplate里面的。DefaultMode的决定是在前一个页面决定的

 这样可以免去来回200次的手工付值,而只是在需要特殊处理的地方做一些处理。这种情况不会很多。双向的Bind机制真是帮到了很多的忙。aspx.cs的代码量也会少很多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值