Asp.Net WebForm MVC ModelBinder機能

7839 ワード

最近シンガポールのプロジェクトをやっていて、自分でTabコントロールを作って、共通のことをたくさん書いています.WebForm擬MVC ModelBinder機能を含む.今日は朝早く起きて、微博を書いてみんなと分かち合って、みんなに貴重な意見を出してください.
去年Aspを習ったことがあります.Net MVC、中にはとても面白い機能があります.ModelBinderです.その表現形式は、VSが特定のModelタイプに応じて対応するページを生成する一方で、VSもページコントロールの値をバックグラウンドModelに自動的にバインドすることができる(本人はどのように使うかしか知らないが、具体的な原理の説明はよく分からない.どのブロガーがこの方面の文章を共有できるか).当時はとても良くて、強いと思っていました.私が接触したわずかないくつかのプロジェクトでは基本的にWebFormモードを使用しています.最初の方法は、手動でサーバ側コントロールをコピーしたり、サーバ側コントロールの値をModelに支払ったりすることです.これは煩雑で、煩わしくて面白くありません.自分がcodingの機械のように感じます.
それから私はAspを思い出した.Netの反射技術は,Reflectionに関する記事も調べ,以下の2つの静的手法を書いた.この2つの方法はツールクラスに含まれています.
1つ目の方法は、Modelの値をサーバ側のコントロールに自動的に付与することです.コードは次のとおりです.
        /// <summary>
        /// bind the properties to the page controls automatically
        /// @copyright gates.li
        /// </summary>
        /// <param name="listType">the type</param>
        /// <param name="page">the page object</param>
        public static void ModelAutoBindControls(IModel model,Page page)
        {
            Type listType = model.GetType();
            //Get element properties and add datatable columns  
            PropertyInfo[] properties = listType.GetProperties();
            foreach (PropertyInfo property in properties)
            {
                string propertyName = property.Name;
                Control c = page.FindControl("tb" + propertyName);
                if (c != null)
                {
                    TextBox tb = c as TextBox;
                    if (tb != null)
                        tb.Text = property.GetValue(model, null) == null ? "" : property.GetValue(model, null).ToString();
                }
                else
                {
                    c = page.FindControl("lb" + propertyName);
                    Label label = c as Label;
                    if (label != null)
                        label.Text = property.GetValue(model, null) == null ? "" : property.GetValue(model, null).ToString();
                }
            }

        }

2つ目の方法は、サーバ側コントロールの値をバックグラウンドModelに自動的にバインドすることです.コードは次のとおりです.
        /// <summary>
        ///  bind the values of  the page controls to the model automatically
        ///  @copyright gates.li
        /// </summary>
        /// <param name="model"></param>
        /// <param name="page"></param>
        public static void ControlsAutoBindModel(IModel model, Page page)
        {
            Type listType = model.GetType();
            //Get element properties and add datatable columns  
            PropertyInfo[] properties = listType.GetProperties();
            foreach (PropertyInfo property in properties)
            {
                string propertyName = property.Name;
                Control c = page.FindControl("tb" + propertyName);
                if (c != null)
                {
                    TextBox tb = c as TextBox;
                    if (tb != null)
                    {
                        property.SetValue(model, tb.Text.Trim(), null);
                    }
                }
            }
        }

上の2つの方法をよく見ると、IModelインタフェースが見つかります.これは当社のシステムアーキテクチャの体現です.これは、すべてのエンティティ・クラスのベース・クラスです.具体的なコードは次のとおりです.
public interface IModel
{
        string validatemessage { get; set; }
        bool validate(); 
}

  
私たちのプロジェクトのすべてのModelクラスは、コードジェネレータを使用して生成され、インタフェースが自動的に実装されます.
上の2つの方法の原理は簡単です:2つの遍歴、1つの約束.
2つのパス:
最初の遍歴:渡されたModelのプロパティの遍歴.
2番目の遍歴:ページオブジェクトPageのControlの遍歴.
1つの規則:命名規則の規則
サーバ側のTextBoxコントロール命名規則は「tb」+Modelの属性名である.
サーバ側のLabelコントロールの名前は「lb」+Modelの属性名です.
 
 
次回は自分が開発したTab Controlを共有する機会があります./tx