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の値をサーバ側のコントロールに自動的に付与することです.コードは次のとおりです.
2つ目の方法は、サーバ側コントロールの値をバックグラウンドModelに自動的にバインドすることです.コードは次のとおりです.
上の2つの方法をよく見ると、IModelインタフェースが見つかります.これは当社のシステムアーキテクチャの体現です.これは、すべてのエンティティ・クラスのベース・クラスです.具体的なコードは次のとおりです.
私たちのプロジェクトのすべてのModelクラスは、コードジェネレータを使用して生成され、インタフェースが自動的に実装されます.
上の2つの方法の原理は簡単です:2つの遍歴、1つの約束.
2つのパス:
最初の遍歴:渡されたModelのプロパティの遍歴.
2番目の遍歴:ページオブジェクトPageのControlの遍歴.
1つの規則:命名規則の規則
サーバ側のTextBoxコントロール命名規則は「tb」+Modelの属性名である.
サーバ側のLabelコントロールの名前は「lb」+Modelの属性名です.
次回は自分が開発したTab Controlを共有する機会があります./tx
去年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