これは、結合良いモデルのasp.net Webフォームの不在下での使用ASHXする必要があるためです。だから私が来るのdllを見つけました。そして、彼はそれをラップします
コードは以下の通りであります:
パブリック クラスModelBinder { パブリック 静的 BinderResultModel <T> BindModel <T>()ここで、 T:新しい() { VAR dicState = 新しいModelStateDictionary()。 ModelBindingExecutionContextコンテキスト = 新しい ModelBindingExecutionContext(新しいHttpContextWrapper(HttpContext.Current)、dicState)。 ModelBindingContext BindingContextを = 新しいModelBindingContext() { ModelBinderProviders = ModelBinderProviders.Providers、 ModelMetadata= ModelMetadataProviders.Current.GetMetadataForType(()=> Activator.CreateInstance <T>()、typeof演算(T)) にModelState = dicState、 ValueProvider = 新しいNameValueCollectionValueProvider(context.HttpContext.Request.Params、CultureInfo.CurrentCulture)、 のvalidateRequest = 真、 }; bindingContext.ValidationNode.ValidateAllProperties = 真; もし(ModelBinders.Binders.DefaultBinder.BindModel(文脈、BindingContextを)) { 戻り 新しい BinderResultModel <T>((T)bindingContext.Model、dicState)。 } 戻り BinderResultModel <T> 。NULL。 } パブリック クラス BinderResultModel <T> T:新しい() { 公共静的 BinderResultModel <T> NULL { 取得 { 戻り新しい BinderResultModel <T>(デフォルト(T)、NULL、" 返回空对象" )。 } } パブリックブールのIsValid { GET ; } パブリック Tデータ{ 得ます。} パブリック 文字列にErrorMessage { 取得 { 戻り _errorMsgと、} プライベート 集合 {_errorMsg = 値。}} プライベートModelStateDictionary _modelStateDic。 プライベート 文字列 _errorMsg = 文字列.Empty。 #region构造函数 公共BinderResultModel(T T、ModelStateDictionary modelStateDic) { IsValidの = 偽。 データ= T。 _modelStateDic = modelStateDic。 もし(!_modelStateDic = ヌル) { のIsValid = _modelStateDic.IsValid。 } _errorMsg = GetErrorMessage()。 } 公共 BinderResultModel(T tの、ModelStateDictionary modelStateDic、ストリング errorMsg内容):この(T、modelStateDic) { _errorMsg = errorMsg内容。 } #endregion #region私有函数 プライベート ストリングGetErrorMessage() { 場合(_modelStateDicがある NULL ) { 戻り 列.Empty。 } のStringBuilderビルダー = 新規のStringBuilder(); foreachの(VARの状態で_modelStateDic) { foreachの(VARのエラーでstate.Value.Errors) { builder.Append(error.ErrorMessage)。 } builder.AppendLine(); } を返す)(builder.ToStringします。 } #endregion } }
Testクラスは、ときに使用します:
クラス人 { // [BindingBehavior(BindingBehavior.Never)] // [必須(にErrorMessage = "名前が必要とされる")] [表示(NAME = " 名前" )] [MINLENGTH(20、にErrorMessage = " 20の最小長さ" )] [正規表現(" / ^ / D $ / "にErrorMessageは= " 正規表現を満足しない" )] パブリック 文字列名前{ GET、SET ;} 公共 のint年齢{ GET、SET;} [BindingBehavior(BindingBehavior.Never)] //決してバインドこの属性が示す 公共リストを< 整数 >リスト{ GET、SET ;} 公共辞書< 文字列、文字列 > DICS { GET、SET ;} [必須(にErrorMessage = " 必須としてミリアンペア" )] パブリックマンミリアンペア{ GET、SET ;} } クラスマン { [必須(にErrorMessage = " 666 666 666 666 ")] パブリック 文字列 MMM { 得ます。セット; } }
使用します。
VaRの結果= ModelBinder.BindModel <人> (); IF (result.IsValid) { // バインドに成功し、検証がdoSomethingのを渡す } 他 { // 何かをします }