Property-level validation errors hinder the validation of Class-level validation

拈花ヽ惹草 提交于 2019-11-29 07:12:14

This isn't supported. If any of the property level validations fail, then the class level validations are not performed. I suggest you look at MVC Foolproof Validation. It extends MVC validation to add support for contingent property validation. I think that would solve the problem for this particular case.

The project site states that it doesn't work with the MVC2 RC, so you'll have to download the source code and get it running/adopt their ideas yourself.

To expand on the link to Scott Guthrie's article, starting with MVC 3, you can perform class level validation by implementing the IValidatableObject Interface.

This will work inside the context of the current validation pipeline so it can be nested on as many custom classes and properties as you like and continue to return the full array of possible error messages.

For your class, ditch the class level attributes, and add a method called Validate like this:

public class EditSiteUser : IValidatableObject
{
    public int UserId { get; set; }

    [Required(ErrorMessage = "Du skal indtaste et brugernavn")]
    public string Username { get; set; }

    [Required(ErrorMessage = "Du skal indtaste en adgangskode")]
    public string Password { get; set; }

    [Required(ErrorMessage="Du skal bekræfte adgangskode")]
    public string PasswordConfirm { get; set; }

    [Required(ErrorMessage = "Du skal indtaste en e-mailadresse")]
    [Email(ErrorMessage = "Ugyldig e-mailadresse")]
    public string Email { get; set; }

    [Required(ErrorMessage="Du skal bekræfte e-mailadressen")]
    [Email(ErrorMessage="Ugyldig e-mailadresse")]
    public string EmailConfirm { get; set; }


    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    { 
      // put whatever class level validation you want here

      if (Email !== EmailConfirm)
      {
          yield return new ValidationResult("E-mailadresserne skal være ens", new[] {"EmailConfirm"})
      }

      if (Password !== PasswordConfirm)
      {
          yield return new ValidationResult("Adgangskoderne skal være ens", new[] {"PasswordConfirm"})
      }
    }

}

You can continue to yield return as many validation messages as you'd like.

And you can display them all on the client with @Html.ValidationSummary

If you'd like the message to appear alongside a particular control, the ValidationResult constructor takes an overload with the memberNames of the affected properties, and you can provide the validation message for that particular property with the ValidationMessageFor HTML helper like this:

@Html.ValidationMessageFor(Function(model) model.TestOne )

Also, it's worth mentioning that you can use the CompareValidator to easily ensure the values of two different properties are equal. The upside to using this annotation is that it automatically knows how to enforce this on the client as well as the server, whereas adding IValidatableObject will only run on the server.

[DataType(DataType.Password)]
public string Password { get; set; }

[Compare("Password")]
[DataType(DataType.Password)]
public string ConfirmPassword { get; set; }

For further reading, Scott Guthrie another post with more detail on class level validation.

From your example, that you like to have a "confirm other input box entry" boxes, the correct implementation would be

 [EqualTo("Email", ErrorMessage = "E-mailadresserne skal være ens")]
 public string EmailConfirm { get; set; }

as the "error" is a validation of the Confirm box. or in other words, you would like to have the Error message next to the confirm box, saying its not the same as in the Email box.

this puts the validation configuration back to the property, and solving your issue.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!