Question

Je cherche à ajouter la validation à ma demande. J'ai quelques règles que je dois vérifier avant d'autoriser les informations à écrire dans la base de données. J'ai la validation des données de base ajoutées au modèle, mais je dois aussi faire en sorte que si un champ a une certaine valeur, cet autre champ est obligatoire. À un moment donné le tutoriel NerdDinner asp.net couvert et j'utilisé que dans le passé pour la validation, mais maintenant je ne peut pas trouver que ou tout autre exemple. Voici mon modèle:

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

Mon contrôleur:

    //
    // 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 n'est pas défini sur false si le code est exécuté IsValid et ne retourne un RuleViolation. Donc, je vérifie manuellement IsValid il retourne false. Quand je reviens à la vue, les messages d'erreur ne semblent pas. Qu'est-ce que je pourrais être absent? Voici quelques extraits des vues.

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>
Était-ce utile?

La solution

Il est très simple - vous avez juste besoin d'appliquer votre attribut de validation à l'ensemble du modèle (ou une classe enfant). Ensuite, l'attribut de validation obtient une référence au modèle au lieu d'une propriété et vous pouvez effectuer vos contrôles sur les propriétés multiples.

Autres conseils

Vous devriez regarder la validation de mot de passe pour un exemple de la façon de le faire.

Consultez le validateur PropertiesMustMatch ici:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top