Привязка данных к текстовым полям - PullRequest
7 голосов
/ 08 июля 2011

Когда вы используете WebForms для вещей, вы, как правило, получаете много текстовых полей на странице, что означает, что вы также склоняетесь к получению кода привязки данных вперед и назад:

tbMyTextBox.Text = MyViewObjectDataClass.MyStringProperty;

и

MyViewObjectDataClass.MyStringProperty = tbMyTextBox.Text;

Это может стать довольно повторяющимся ....

Я могу автоматизировать сопоставления между моим объектом просмотра и моим объектом домена, используя AutoMapper, что приводит меня к вопросу ...

Есть ли способ сделать элемент формы ASP.Net для автоматического просмотра объекта? Не прибегая к десяткам вышеперечисленных строк?

Да, я мог бы просто переключиться на MVC, но это не вариант для многих текущих проектов.

Ответы [ 3 ]

5 голосов
/ 20 сентября 2011

Как насчет этого подхода в файлах ASPX:

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

Но нам все еще нужно добавить операторы:

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

Другой подход - использовать пользовательский элемент управления, подобный этому:

            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);
                }
            }

Затем используйте его в файлах 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>
0 голосов
/ 24 сентября 2015
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));
            }
        }
    }
}
}

Использование

ASP:

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

C #:

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

Вы можете добавить столько разных WebControls, сколько вамкак я застрял с двумя выше.

0 голосов
/ 06 июня 2013

Возможно, вы захотите проверить этот пост Рика Штрола о поставках двусторонней привязки http://msdn.microsoft.com/en-gb/magazine/cc163505.aspx

...