2011-07-07 21 views
7

Podczas korzystania WebForms do rzeczy, masz tendencję do końca się z wielu pól tekstowych na stronie, co oznacza, że ​​również mają tendencję do końca się z tyłu i do przodu wiązania danych Kod:dane bloku tekstowego wiążące

tbMyTextBox.Text = MyViewObjectDataClass.MyStringProperty; 

i

MyViewObjectDataClass.MyStringProperty = tbMyTextBox.Text; 

To może być dość monotonne ....

mogę zautomatyzować mapowania między moim zdaniem obiektu i mojego obiektu domeny za pomocą AutoMapper, co prowadzi mnie do pytania ...

Czy istnieje jakiś sposób na wykonanie elementu formularza ASP.Net w celu automatycznego wyświetlania obiektu? Bez uciekania się do kilkudziesięciu powyższych linii?

Tak, mógłbym przejść do MVC, ale nie jest to opcja dla wielu trwających projektów.

+0

ASP.NET Web Forms vNext będzie to mieć. http://weblogs.asp.net/scottgu/archive/2011/09/05/web-forms-model-binding-part-1-selecting-data-asp-net-vnext-series.aspx – CheckRaise

Odpowiedz

4

Jak o tym podejściu w plikach ASPX:

<asp:TextBox ID="TextBox1" runat="server" Text='<%#MyViewObjectDataClass.Name %>'></asp:TextBox> 

Ale wciąż musimy dodać oświadczenia:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      this.DataBind(); 
     } 
    } 

Innym podejściem użyć niestandardowego formantu tak:

  public class NullPanel : Panel 
      { 
       private bool _autoBind = true; 

       public override void RenderBeginTag(System.Web.UI.HtmlTextWriter writer) 
       { 
        //base.RenderBeginTag(writer); 
       } 

       public override void RenderEndTag(System.Web.UI.HtmlTextWriter writer) 
       { 
        //base.RenderEndTag(writer); 
       } 

       protected override System.Web.UI.HtmlTextWriterTag TagKey 
       { 
        get 
        { 
         return System.Web.UI.HtmlTextWriterTag.Unknown; 
        } 
       } 

       [DefaultValue(true)] 
       public bool AutoBind 
       { 
        get 
        { 
         return _autoBind; 
        } 
        set 
        { 
         _autoBind = value; 
        } 
       } 

       protected override void OnLoad(EventArgs e) 
       { 
        base.OnLoad(e); 
        //Set Visible property as true that intent to rise OnPreRender method 
        this.Visible = true; 
       } 

       protected override void DataBindChildren() 
       { 
        if (this.Visible && this.AutoBind) 
        { 
         base.DataBindChildren(); 
        } 
       } 

       protected override void OnPreRender(EventArgs e) 
       { 
        if (this.AutoBind) 
        { 
         this.DataBind(); 
        } 
        base.OnPreRender(e); 
       } 
      } 

Następnie użyj go w plikach ASPX:

<asp:NullPanel ID="panelFenInfo" runat="server" 
     Visible='<%#this.IsEditMode%>' > 
    <asp:TextBox ID="tbName" runat="server" Text='<%#this.MyViewObjectDataClass.Name %>'></asp:TextBox> 
<asp:NullPanel> 
<asp:NullPanel ID="panelInfo" runat="server" 
     Visible='<%#!Page.IsPostBack%>' > 
    <asp:TextBox ID="tbCompany" runat="server" Text='<%#this.MyViewObjectDataClass.Name %>'></asp:TextBox> 
<asp:NullPanel> 
+1

Dzięki za to Wskazówka .DataBind()! – box86rowh

0
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Reflection; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace Lib 
{ 
public class MVAchiever<T> 
{ 
    private T model; 
    public T PullData(string ServerClass, Control cr) 
    { 
     model = (T)Activator.CreateInstance(typeof(T)); 
     if (cr.HasControls()) 
     { 
      loopControl(cr, ServerClass); 
     } 
     return model; 
    } 
    private void loopControl(Control cr, string ServerClass) 
    { 
     foreach (Control c in cr.Controls) 
     { 
      if (c is WebControl) 
      { 
       WebControl wc = (WebControl)c; 
       getThisDataFrom(wc, ServerClass); 
      } 
      if (c.HasControls()) 
      { 
       loopControl(c, ServerClass); 
      } 
     } 
    } 
    private void getThisDataFrom(WebControl wc, string ServerClass) 
    { 
     string className = wc.Attributes["ServerClass"]; 
     string propName = wc.Attributes["ServerProperty"]; 
     string val = ""; 
     if (className == ServerClass && !string.IsNullOrEmpty(propName)) 
     { 
      if (wc is DropDownList) 
      { 
       val = ((DropDownList)wc).SelectedValue; 
      } 
      else if (wc is TextBox) 
      { 
       val = ((TextBox)wc).Text; 
      }     
      PropertyInfo pi = typeof(T).GetProperty(propName); 
      Type pt = pi.PropertyType; 
      if (!string.IsNullOrEmpty(val) && TypeDescriptor.GetConverter(pt).IsValid(val)) 
      { 
       pi.SetValue(model, Convert.ChangeType(val, pt)); 
      } 
     } 
    } 
} 
} 

Wykorzystanie

ASP dwukierunkowej:

<asp:TextBox ID="TextBox1" runat="server" ServerClass="Model" ServerProperty="PropertyName"></asp:TextBox> 

C#:

Model m = new MVAchiever<Model>().PullData("Model", Panel); 

Możesz dodać tyle różnych WebControlów, ile chcesz, utknąłem z dwoma wyżej.

Powiązane problemy