以用戶注冊為例,來說一下MVC中向數據表中添加數據的方法
從WEB層說起:有兩個action,分別實現顯示注冊界面和提交注冊請求的作用,在action中,對表單實體進行了數據有效性的驗證,代碼如下:
public ActionResult Register() { return View(); } [HttpPost] public ActionResult Register(UserBases entity) { if (entity.IsValid) { if (iUserRepository.RegisterUser(entity).IsComplete) { #region 寫′cookies #endregion return RedirectToAction("RegSuccess", "Account"); } else { ModelState.AddModelError("", "注¢冊á用?戶§失§敗ü"); } } else { entity.GetRuleViolations().ToList().ForEach(i => { ModelState.AddModelError(i.PropertyName, i.ErrorMessage); }); } return View(); } 省略一下BLL層,直接用DATA層了,它主要有個性操作接口和統一操作接口,一個實體操作分別要繼承這兩個接口,及一個提代數據庫上下文和CURD操作的基類,代碼如下:
public class UserRepository : Car_RentalRepositoryBase, IUserRepository { #region IUserRepository 成é員± public VMessage RegisterUser(UserBases entity) { VMessage vm = new VMessage(); try { base.InsertEntity(entity); vm.IsComplete = true; } catch (Exception) { vm.IsComplete = false; throw; } return vm; }
這個類的結構如下:
DATA層向WEB層返回信息是統一的消息對象VMessage,它個類由一個bool型的屬性和一個實體對象組成。
最后說明一點,就是在MVC模式下,進行前台表單驗證時,直接用ModelState.AddModelError方法就可以把錯誤信息直接綁定到屬性的上面,非常方便,在調用時
代碼如下:
entity.GetRuleViolations().ToList().ForEach(i => { ModelState.AddModelError(i.PropertyName, i.ErrorMessage); });
還有一個要說明的就是GetRuleViolations這個方法,它是我們在實體中定義的,將所有不通過證明的信息,以迭代的方式進行返回,代碼如下:
/// <summary>
/// 用戶實體數據級驗證(數據有效性驗證)
/// </summary>
public partial class UserBases
{
public override IEnumerable<RuleViolation> GetRuleViolations()
{
if (string.IsNullOrEmpty(this.UserID))
yield return new RuleViolation(ValidatorMessage.Current.GetMessage(ValidatorMessageType.RequiredField, "UserID"), "UserID");
if (string.IsNullOrEmpty(this.Email))
yield return new RuleViolation("請輸入電子郵件", "Email");
if (string.IsNullOrEmpty(this.Name))
yield return new RuleViolation("用戶名不能為空", "Name");
}
}
大家如果對MVC實體驗證有什么好的方式可以給我留言。