问题: 试想一个表单有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的代码量也会少很多。