Frage

Ich habe verstanden, wie man benutzerdefinierte Validierungsattribute erstellt. Tatsächlich wird die Validierungsmethode ausgeführt, wenn ich die Saatgutmethode verwende, um die Datenbank vorzubeziehen, und wenn sie fehlschlägt, wird eine Ausnahme ausgelöst. Die Validierung funktioniert jedoch nicht auf der Erstellung der Entität.

Muss ich etwas in die HTML (Razor -Form) ändern?

Ich kann nur Elemente hinzufügen, die die Validierung nicht bestehen.

Code hier:

namespace Data.Model
{
    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
    sealed public class YearsValidationAttribute : ValidationAttribute
    {
        // Internal field to hold the min value.
        readonly int _years;

        public int Years
        {
            get { return _years; }
        }

        public YearsValidationAttribute(int years)
        {
            _years = years;
        }


        public override bool IsValid(object value)
        {
            var years = (int)value;
            bool result = true;
            if (this.Years != null)
            {
                result = Years >= years;
            }
            return result;
        }



        public override string FormatErrorMessage(string name)
        {
            return String.Format(CultureInfo.CurrentCulture,
              ErrorMessageString, name, Years);
        }
    }
}


public class Position
    {
        [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]   
        public int PositionID { get; set; }

        [Required(ErrorMessage = "Position name is required.")]
        [StringLength(20, MinimumLength = 3, ErrorMessage = "Name should not be longer than 20 characters.")]
        [Display(Name = "Position name")]              
        public string name { get; set; }

        [Required(ErrorMessage = "Number of years is required")] 
        [Display(Name = "Number of years")]
        [YearsValidationAttribute(5, ErrorMessage = "{0} value must be greater than {1} years.")]        
        public int yearsExperienceRequired { get; set; }

        public virtual ICollection<ApplicantPosition> applicantPosition { get; set; }
    }



@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Position</legend>

        @Html.HiddenFor(model => model.PositionID)

        <div class="editor-label">
            @Html.LabelFor(model => model.name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.name)
            @Html.ValidationMessageFor(model => model.name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.yearsExperienceRequired)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.yearsExperienceRequired)
            @Html.ValidationMessageFor(model => model.yearsExperienceRequired)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}
War es hilfreich?

Lösung

Dieser Code, den Sie haben, gibt Ihnen keinen Client -Validator, nur die Serverseite. Aber das ist ein guter Ausgangspunkt. Was Sie in Ihrer Aktionsmethode auf dem Server tun müssen, besteht darin, zu überprüfen, ob das Modell wie solche gültig ist:

public ActionResult YourAction(YourModel model)
{
    if(ModelState.IsValid)
    {
        // Do your save
    }
    else
    {
        // Do your other stuff
    }
}

Wenn Sie auch die validierung der Client -Seite möchten, können Sie die Ressourcen hier verwenden: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusiv-validation.html

Sie können auch versuchen, die zu verwenden Remote Validierungsattribut: http://msdn.microsoft.com/en-us/library/gg508808(v=vs.98).aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top