2010-11-19 32 views
0

Uygulamamıza doğrulama eklemeyi deniyorum. Bilginin veritabanına yazılmasına izin vermeden önce kontrol etmem gereken bazı kurallar var. Modele temel veri doğrulaması eklendim, ancak bir alanın belirli bir değeri varsa, diğer alanın gerekli olduğundan emin olmalıyım. Bir keresinde, asp.net'daki NerdDinner öğreticisi bunu kapsamıştı ve bunu geçmişte doğrulama için kullandım, ancak şimdi bunu veya başka bir örneği bulamıyorum.ASP.NET MVC2 Uygulaması için özel doğrulama kuralları

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; 
    } 
} 

Benim denetleyicisi:

// 
    // 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

IsValid kod çalıştırılır olsa false ayarlı değil ve bir RuleViolation çıkmıyor İşte benim modelidir. Bu yüzden IsValid'u elle kontrol ediyorum, false döndürür. Görünüme döndüğümde, hata mesajları görünmez. Ne eksik olabilirim? İşte görünümlerin bazı parçacıkları.

O çıkmak oluyor

<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> 

cevap

1

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 e basit - doğrulama modelinizi tüm modele (veya bir çocuk sınıfına) uygulamanız yeterlidir. Daha sonra doğrulama özniteliği, yalnızca bir özellik yerine modele bir başvuru alır ve çeklerinizi birden çok özellikte gerçekleştirebilirsiniz.

+0

Evet, ben bu yazdıktan sonra bir kez daha baktı. NerdDinner örneği 'ModelState.AddRuleViolations()' adlı bir yardımcı yöntem kullanmıştır. İhlalleri ekleyen 'ModelState.AddModelError() 'Teşekkürler! –

0

Bunu nasıl yapacağınıza dair bir örnek için parola doğrulamasına bakmalısınız. Burada PropertiesMustMatch doğrulayıcıda dışarı

Kontrol:

http://msdn.microsoft.com/en-us/magazine/ee336030.aspx

+0

Ancak istediği bu değil. –

+0

Doğrulama niteliklerini kullanarak iki özelliği karşılaştırmayı gösterir. – rboarman