Asp.net MVCÔ´Âë·ÖÎö--Model Validation(Server¶Ë)ʵÏÖ(1)
Ò».MVC Validation Ó÷¨:
ÔÚAsp.net MVC ¿ò¼ÜÖÐÈç¹ûÐèÒª¶ÔModel ¶ÔÏó¼ÓÈëÑéÖ¤,ÎÒÃÇ¿ÉÒÔÔÚModelµÄÊôÐÔÉϱê¼ÇËùÓм̳ÐÓÚValidationAttributeµÄAttributeÌØÐÔ.
ÀýÈçÏÂÃæµÄ´úÂëÖÐ,StringLength/Range/Compare ¶¼ÊǼ̳ÐÓÚValidationAttributeÀà.
public ActionResult LogOn(LogOnModel model, string returnUrl) { this.ValidateModel(model); if (ModelState.IsValid) { if (MembershipService.ValidateUser(model.UserName, model.Password)) { FormsService.SignIn(model.UserName, model.RememberMe); if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Home"); } } else { ModelState.AddModelError("", "The user name or password provided is incorrect."); } } // If we got this far, something failed, redisplay form return View(model); }
ÕâÀïÐèҪעÒâµÄÊÇÈç¹ûÎÒÃDz»µ÷ÓÃValidateModel ·½·¨ActionÉϵÄModel¶ÔÏóĬÈÏÒ²ÊÇÄܹ»ÑéÖ¤µÄ£¬ÕâÊÇÒòΪÔڰ󶨶ÔÏó½×¶ÎDefaultModelBinder.BindComplexElementalModel·½·¨ÖÐMVC´¥·¢ÁËÑéÖ¤µÄ·½·¨¡£
DefaultModelBinder.cs
internal void BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, object model) { // need to replace the property filter + model object and create an inner binding context ModelBindingContext newBindingContext = CreateComplexElementalModelBindingContext(controllerContext, bindingContext, model); // validation if (OnModelUpdating(controllerContext, newBindingContext)) { BindProperties(controllerContext, newBindingContext); OnModelUpdated(controllerContext, newBindingContext); } } protected virtual void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) { Dictionary<string, bool> startedValid = new Dictionary<string, bool>(StringComparer.OrdinalIgnoreCase); foreach (ModelValidationResult validationResult in ModelValidator.GetModelValidator(bindingContext.ModelMetadata, controllerContext).Validate(null)) { string subPropertyName = CreateSubPropertyName(bindingContext.ModelName, validationResult.MemberName); if (!startedValid.ContainsKey(subPropertyName)) { startedValid[subPropertyName] = bindingContext.ModelState.IsValidField(subPropertyName); } if (startedValid[subPropertyName]) { bindingContext.ModelState.AddModelError(subPropertyName, validationResult.Message); } } }
¶þ.ValidateModel·½·¨Ô´Âë·ÖÎö
ÏÂÃæÎÒÃÇ¿´Ò»ÏÂMVC ÊÇÈçºÎʵÏÖValidateModel·½·¨ÑéÖ¤µÄ.
protected internal void ValidateModel(object model) { ValidateModel(model, null /* prefix */); } protected internal void ValidateModel(object model, string prefix) { if (!TryValidateModel(model, prefix)) { throw new InvalidOperationException( String.Format( CultureInfo.CurrentCulture, MvcResources.Controller_Validate_ValidationFailed, model.GetType().FullName ) ); } } protected internal bool TryValidateModel(object model) { return TryValidateModel(model, null /* prefix */); } protected internal bool TryValidateModel(object model, string prefix) { if (model == null) { throw new ArgumentNullException("model"); } ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType()); foreach (ModelValidationResult validationResult in ModelValidator.GetModelValidator(metadata, ControllerContext).Validate(null)) { ModelState.AddModelError(DefaultModelBinder.CreateSubPropertyName(prefix, validationResult.MemberName), validationResult.Message); } return ModelState.IsValid; }ÎÒÃÇ¿ÉÒÔ¿´µ½µÚ28ÐÐMVCÊǵ÷ÓÃÁËModelValidator.GetModelValidator À´»ñÈ¡Model µÄValidator ¶ÔÏóµÄ.ÎÒÃÇ¿´Ò»ÏÂÕâ¸ö·½·¨µÄʵÏÖ,Ëü·µ»ØµÄÊÇCompositeModelValidator¶ÔÏó.
public static ModelValidator GetModelValidator(ModelMetadata metadata, ControllerContext context) { return new CompositeModelValidator(metadata, context); }
CompositeModelValidator.csprivate class CompositeModelValidator : ModelValidator { public CompositeModelValidator(ModelMetadata metadata, ControllerContext controllerContext) : base(metadata, controllerContext) { } public override IEnumerable<ModelValidationResult> Validate(object container) { bool propertiesValid = true; foreach (ModelMetadata propertyMetadata in Metadata.Properties) { foreach (ModelValidator propertyValidator in propertyMetadata.GetValidators(ControllerContext)) { //Robbin:Ò»µ«Validate·µ»ØÁËModelValidationResult¾ÍÖ¤Ã÷Ñé֤ûÓÐͨ¹ý£® foreach (ModelValidationResult propertyResult in propertyValidator.Validate(Metadata.Model)) { propertiesValid = false; yield return new ModelValidationResult { MemberName = DefaultModelBinder.CreateSubPropertyName(propertyMetadata.PropertyName, propertyResult.MemberName), Message = propertyResult.Message }; } } } if (propertiesValid) { foreach (ModelValidator typeValidator in Metadata.GetValidators(ControllerContext)) { foreach (ModelValidationResult typeResult in typeValidator.Validate(container)) { yield return typeResult; } } } } }ÎÒÃÇÔÙ¿´Ò»ÏÂÉÏÃæµÚ10ÐУ¬propertyMetadata.GetValidatorsÕâ¸ö·½·¨µÄʵÏÖ,Ëû·µ»ØÁËËùÓеÄValidatorµÄʵÏÖ¡£²¢ÇÒÔÚ12ÐУ¬µ÷ÓÃÕâЩʵÏÖµÄValidate·½·¨½øÐÐÑéÖ¤²Ù×÷.public virtual IEnumerable<ModelValidator> GetValidators(ControllerContext context) { return ModelValidatorProviders.Providers.GetValidators(this, context); }Ëüµ÷ÓÃÁËModelValidatorProviders.Providers¶ÔÏóµÄGetValidators ·½·¨. Õâ¸ö¶ÔÏóµÄÀàÐÍÊÇModelValidatorProviderCollection½ÓÏÂÀ´ÎÒÃÇ¿´Ò»ÏÂModelValidatorProviders.ProvidersµÄʵÏÖ
public static class ModelValidatorProviders { private static readonly ModelValidatorProviderCollection _providers = new ModelValidatorProviderCollection() { new DataAnnotationsModelValidatorProvider(), new DataErrorInfoModelValidatorProvider(), new ClientDataTypeModelValidatorProvider() }; public static ModelValidatorProviderCollection Providers { get { return _providers; } } }Õâ¸ö¶ÔÏó³õʼ»¯Ê±Ä¬ÈϰüÀ¨ÁËÈý¸öValidatorProvider,ÔÚÕâÀïÎÒÃÇÐèÒª×Å֨עÒâµÄÊÇDataAnnotationsModelValidatorProvider,ËüÌṩÁËËùÓÐϵͳĬÈϵÄValidation¹æÔò(³ýÁËRemoteAttribute).
ÍÆ¼öÐÅÏ¢
ÈÈÃÅÐÅÏ¢
- nohup: redirecting stderr to stdou....
- ʹÓÃlog_formatΪNginx·þÎñÆ÷ÉèÖøüÏêϸµÄÈÕÖ¾¸ñʽ
- jquery easyUI--dataGrid-Json
- [Ô´´]·ÂGoogle Reader¡¢ÐÂÀË΢²©¡¢ÌÚѶ΢²©µ....
- ÀûÓÃKeepalived+mysql¹¹½¨¸ß¿ÉÓÃMySQLË«Ö÷×Ô¶....
- Nginx+keepalivedʵÏÖ¸ºÔؾùºâºÍË«»úÈȱ¸¸ß¿ÉÓÃ
- jqueryʵÏÖÒ³Ãæ¼ÓÔØ½ø¶ÈÌõ
- Rolling cURL: PHP²¢·¢×î¼Ñʵ¼ù
- codeigniter ·ÓÉÖÕ¼«ÓÅ»¯(url rewrite)
- linuxÏÂÉèÖÃsshÎÞÃÜÂëµÇ¼
×î½ü¸üÐÂ
- Asp.net MVCÔ´Âë·ÖÎö--Model Validation(Se....
- .Net À¬»ø»ØÊÕ»úÖÆÔÀíºÍËã·¨£¨Ò»£©
- .netʵÌåнâ
- ·ÖÎöASP.NET¶ÁÈ¡XMLÎļþ4ÖÖ·½·¨
- »ñÈ¡ÍøÕ¾ËõÂÔͼ´úÂë
- Asp.net ¸ù¾ÝIPµØÖ·»ñÈ¡¿çÍø¶ÎmacµØÖ·º¯Êý¡¾ËѲء¿
- ¹ýÂËÃô¸Ð¹Ø¼ü×Ö¡£
- Éú³ÉÖ¸¶¨Î»ÊýµÄËæ»ú×Ö·û´®
- ¿Í»§¶Ë»ñÈ¡MACµØÖ·£¬µ½·þÎñÆ÷ÑéÖ¤
- ²½²½ÎªÓª .NETÈý²ã¼Ü¹¹½âÎö ¶þ¡¢Êý¾Ý¿âÉè¼Æ
ÆÀÂÛ