程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> Asp.net MVC示例項目“Suteki.Shop”分析之數據驗證

Asp.net MVC示例項目“Suteki.Shop”分析之數據驗證

編輯:關於ASP.NET

在Suteki.Shop,實現了自己的數據校驗機制,可以說其設計思路還是很有借鑒價值的。而使用這種 機制也很容易在Model中對相應的實體對象(屬性)添加校驗操作方法。下面就來介紹一下其實現方式。

首先,看一下這樣類圖:

在Suteki.Shop定 義一個“IValidatingBinder”接口,其派生自IModelBinder:

其接口中定義了一個 重載方法UpdateFrom,其要實現的功能與MVC中UpdateFrom一樣,就是自動讀取我們在form中定義的有些 元素及其中所包含的內容。

實現IValidatingBinder接口的類叫做:ValidatingBinder,下面是 其核心代碼說明。

首先是BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)該方法是在IModelBinder接口中定義的,是其核心功能,用於將 客戶端數據轉成我們希望Model類型。

public virtual void UpdateFrom(BindingContext bindingContext)
{
foreach (var property in bindingContext.Target.GetType ().GetProperties())
{
try
{
foreach (var binder in propertyBinders)
{
binder.Bind(property, bindingContext);
}
}
catch (Exception exception)
{
if (exception.InnerException is FormatException ||
exception.InnerException is IndexOutOfRangeException)
{
string key = BuildKeyForModelState(property, bindingContext.ObjectPrefix);
bindingContext.AddModelError(key, bindingContext.AttemptedValue, "Invalid value for {0}".With(property.Name));
bindingContext.ModelStateDictionary.SetModelValue(key, new ValueProviderResult(bindingContext.AttemptedValue, bindingContext.AttemptedValue, CultureInfo.CurrentCulture));
}
else if (exception is ValidationException)
{
string key = BuildKeyForModelState(property, bindingContext.ObjectPrefix);
bindingContext.AddModelError(key, bindingContext.AttemptedValue, exception.Message);
bindingContext.ModelStateDictionary.SetModelValue(key, new ValueProviderResult (bindingContext.AttemptedValue, bindingContext.AttemptedValue, CultureInfo.CurrentCulture));
}
else if (exception.InnerException is ValidationException)
{
string key = BuildKeyForModelState(property, bindingContext.ObjectPrefix);
bindingContext.AddModelError(key, bindingContext.AttemptedValue, exception.InnerException.Message);
bindingContext.ModelStateDictionary.SetModelValue(key, new ValueProviderResult (bindingContext.AttemptedValue, bindingContext.AttemptedValue, CultureInfo.CurrentCulture));
}
else
{
throw;
}
}

}
if (!bindingContext.ModelStateDictionary.IsValid)
{
throw new ValidationException("Bind Failed. See ModelStateDictionary for errors");
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved