2010-11-19 7 views
0

Ich versuche, meiner Anwendung eine Validierung hinzuzufügen. Ich muss einige Regeln überprüfen, bevor ich die Informationen in die Datenbank schreiben darf. Ich habe die grundlegende Datenvalidierung dem Modell hinzugefügt, aber ich muss auch sicherstellen, dass, wenn ein Feld einen bestimmten Wert hat, dieses andere Feld benötigt wird. Zu einer Zeit das NerdDinner Tutorial bei asp.net abgedeckt, und ich habe das in der Vergangenheit für die Validierung, aber jetzt kann ich nicht finden, dass oder irgendein anderes Beispiel. Hier ist mein Modell:Benutzerdefinierte Validierungsregeln für ASP.NET MVC2-Anwendung

public class DayRequested 
{ 
    public int RequestId { set; get; } 
    [Required, DisplayName("Date of Leave")] 
    public string DateOfLeave { get; set; } 
    [Required, DisplayName("Time of Leave")] 
    public string TimeOfLeave { get; set; } 
    [Required, DisplayName("Hours Requested")] 
    [Range(0.5, 24, ErrorMessage = "Requested Hours must be within 1 day")] 
    public double HoursRequested { get; set; } 
    [Required, DisplayName("Request Type")] 
    public string RequestType { get; set; } 
    [DisplayName("Specify Relationship")] 
    public string Relationship { get; set; } 
    [DisplayName("Nature of Illness")] 
    public string NatureOfIllness { get; set; } 
    public bool AddedToTimesheet { get; set; } 

    public bool IsValid 
    { 
     get { return (GetRuleViolations().Count() == 0); } 
    } 

    public IEnumerable<RuleViolation> GetRuleViolations() 
    { 
     if (String.IsNullOrEmpty(DateOfLeave)) 
      yield return new RuleViolation("Date of Leave Required", "DateOfLeave"); 
     if (String.IsNullOrEmpty(TimeOfLeave)) 
      yield return new RuleViolation("Date of Leave Required", "TimeOfLeave"); 
     if ((HoursRequested < 0.5) || (HoursRequested > 24)) 
      yield return new RuleViolation("Hours must be in a period of one day", "HoursRequested"); 
     if (String.IsNullOrEmpty(RequestType)) 
      yield return new RuleViolation("Request Type is required", "RequestType"); 
     if ((!String.IsNullOrEmpty(NatureOfIllness)) && (NatureOfIllness.Length < 3)) 
      yield return new RuleViolation("Nature of Illness must be longer 2 characters", "NatureOfIllness"); 

     // Advanced data validation to make sure rules are followed 
     LeaveRequestRepository lrr = new LeaveRequestRepository(); 
     List<LeaveRequestType> lrt = lrr.GetAllLeaveRequestTypes(); 
     LeaveRequestType workingType = lrt.Find(b => b.Id == Convert.ToInt32(RequestType)); 

     if ((String.IsNullOrEmpty(Relationship)) && (workingType.HasRelationship)) 
      yield return new RuleViolation("Relationship is Required", "Relationship"); 
     if ((String.IsNullOrEmpty(NatureOfIllness)) && (workingType.HasNatureOfIllness)) 
      yield return new RuleViolation("Nature of Illness is Required", "NatureOfIllness"); 

     yield break; 
    } 
} 

Mein Controller:

// 
    // POST: /LeaveRequest/Create 
    [Authorize, HttpPost] 
    public ActionResult Create(LeaveRequest leaveRequest, List<DayRequested> requestedDays) 
    { 
     if (ModelState.IsValid) 
     { 
      foreach (DayRequested requestedDay in requestedDays) 
      { 
       requestedDay.RequestId = leaveRequest.RequestId; 
       requestedDay.NatureOfIllness = (String.IsNullOrEmpty(requestedDay.NatureOfIllness) ? "" : requestedDay.NatureOfIllness); 
       requestedDay.Relationship = (String.IsNullOrEmpty(requestedDay.Relationship) ? "" : requestedDay.Relationship); 

       if (requestedDay.IsValid) 
        lrRepository.CreateNewLeaveRequestDate(requestedDay); 
       else 
        return View(new LeaveRequestViewModel(leaveRequest, requestedDays, lrRepository.GetLeaveRequestTypes())); 
      } 

      if (leaveRequest.IsValid) 
       lrRepository.CreateNewLeaveRequest(leaveRequest); 
      else 
       return View(new LeaveRequestViewModel(leaveRequest, requestedDays, lrRepository.GetLeaveRequestTypes())); 
     } 
     else 
      return View(new LeaveRequestViewModel(leaveRequest, requestedDays, lrRepository.GetLeaveRequestTypes())); 

     return RedirectToAction("Index", lrRepository.GetLeaveRequests(udh.employeeId)); 
    } 

ModelState.IsValid ist nicht auf false gesetzt, obwohl der Code in IsValid ausgeführt wird und ein RuleViolation zurückgibt. Also überprüfe ich manuell IsValid es gibt false zurück. Wenn ich zur Ansicht zurückkehre, erscheinen die Fehlermeldungen nicht. Was könnte ich vermissen? Hier sind einige Schnipsel der Ansichten.

Create.aspx

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Create New Leave Request</h2> 
    <div><%= Html.ActionLink("Back to List", "Index") %></div> 
    <%= Html.Partial("RequestEditor", Model) %> 
    <div><%= Html.ActionLink("Back to List", "Index") %></div> 
</asp:Content> 

RequestEditor.ascx

<% using (Html.BeginForm()) {%> 
    <%= Html.ValidationSummary(true) %> 
     <table id="editorRows"> 
      <% foreach (var item in Model.DaysRequested) 
       Html.RenderPartial("RequestedDayRow", new EmployeePayroll.ViewModels.LeaveRequestRow(item, Model.LeaveRequestType)); %> 
     </table> 
     <p>Type your time to sign your request.</p> 
     <p><%= Html.LabelFor(model => model.LeaveRequest.EmployeeSignature) %>: 
      <%= Html.TextBoxFor(model => model.LeaveRequest.EmployeeSignature, new { Class="required" })%> 
      <%= Html.ValidationMessageFor(model => model.LeaveRequest.EmployeeSignature)%></p> 
     <p><input type="submit" value="Submit Request" /></p> 
<% } %> 

RequestedDayRow.ascx

<tbody class="editorRow"> 
    <tr class="row1"></tr> 
    <tr class="row2"> 
     <td colspan="2" class="relationship"> 
      <%= Html.LabelFor(model => model.DayRequested.Relationship)%>: 
      <%= Html.TextBoxFor(model => model.DayRequested.Relationship) %> 
      <%= Html.ValidationMessageFor(model => model.DayRequested.Relationship)%> 
     </td> 
     <td colspan="2" class="natureOfIllness"> 
      <%= Html.LabelFor(model => model.DayRequested.NatureOfIllness)%>: 
      <%= Html.TextBoxFor(model => model.DayRequested.NatureOfIllness) %> 
      <%= Html.ValidationMessageFor(model => model.DayRequested.NatureOfIllness)%> 
     </td> 
     <td></td> 
    </tr> 
</tbody> 

Antwort

1

Es verlassen hat e einfach - Sie müssen nur Ihr Validierungsattribut auf das gesamte Modell (oder eine Kindklasse) anwenden. Dann erhält das Validierungsattribut eine Referenz auf das Modell und nicht nur eine Eigenschaft, und Sie können Ihre Prüfungen für mehrere Eigenschaften durchführen.

+0

Yep, schaute ich noch einmal zurück, nachdem dieses Posting. Das NerdDinner-Beispiel verwendete eine Hilfsmethode mit dem Namen 'ModelState.AddRuleViolations()'. Welche hinzugefügt die Verstöße zu 'ModelState.AddModelError()' Danke! –