2016-04-11 8 views
1

Ich verwende Datenannotationen für clientseitige Validierungen. Ich habe zwei Szenarien, in denen ich [Required] und [RequiredIfTrue] verwende. Problem ist, dass meine bedingten Validierungen nicht funktionieren.Bedingte Validierungen funktionieren nicht

Arbeits:

Modell:

[DisplayName(@"Custom Email Confirmation Address")] 
[EmailAddress(ErrorMessage = @"Invalid Email Address")] 
public string CustomEmailConfirmationAddress { get; set; } 

Ausblick:

<div> 
    <%=Html.RequiredLabelFor(m => m.CustomEmailConfirmationAddress) %> 
    <%=Html.TextBoxFor(m => m.CustomEmailConfirmationAddress, new { maxlength = 100 })%> 
    <%=Html.ValidationMessageFor(m => m.CustomEmailConfirmationAddress)%> 
</div> 

nicht funktioniert:

Szenario = Wenn ShowConceptOptInMessage checke ist d als make ConceptEmailOptInMessage und PrivacyPolicy Feld erforderlich.

Modell:

[DisplayName("Show Concept Opt-In Message")] 
public bool ShowConceptOptInMessage { get; set; } 

[RequiredIfTrue("ShowConceptOptInMessage", ErrorMessage = "Concept Email Opt-In Message is required")] 
[DisplayName("Concept Email Opt-In Message")] 
public string ConceptEmailOptInMessage { get; set; } 

[RequiredIfTrue("ShowConceptOptInMessage", ErrorMessage = "Concept Privacy Policy is required")] 
[DisplayName("Concept Privacy Policy")] 
public string PrivacyPolicy { get; set; } 

Ausblick:

<div> 
    <%=Html.LabelFor(m => m.ShowConceptOptInMessage) %> 
    <%=Html.CheckBoxFor(m => m.ShowConceptOptInMessage)%> 
    <%=Html.ValidationMessageFor(m => m.ShowConceptOptInMessage)%> 
</div> 

<div> 
    <%=Html.LabelFor(m => m.ConceptEmailOptInMessage) %> 
    <%=Html.TextAreaFor(m => m.ConceptEmailOptInMessage, new { maxlength = 1000 })%> 
    <%= Html.ValidationMessageFor(m => m.ConceptEmailOptInMessage)%> 
</div> 

<div> 
    <%=Html.LabelFor(m => m.PrivacyPolicy) %> 
    <%=Html.TextAreaFor(m => m.PrivacyPolicy)%> 
    <%= Html.ValidationMessageFor(m => m.PrivacyPolicy)%> 
</div> 

Controller-Methode für beide Szenario:

Controller:

[HttpPost] 
public ActionResult Edit(ConceptConfigurationModel model) 
{ 
    try 
    { 
     if (this.ModelState.IsValid) 
     { 
      // model 
      this.ConceptManager.SaveConcept(model); 
      model.Submitted = true; 
     } 
    } 
    catch (BusinessLogicException ex) 
    { 
     this.ModelState.AddModelError("ConceptName", ex.Message); 
    } 
    ModelState.Clear(); 
    this.ConceptManager.FillConceptModel(model); 

    return View(model); 
} 
+0

Nicht sicher, warum Sie eine Antwort akzeptiert haben, die nichts mit Ihrem Problem zu tun hat und ist nur ein schrecklicher Hack. Angenommen, Sie verwenden [idiotensicher] (http://foolproof.codeplex.com/) '[RequiredIfTrue]' und Sie haben die relevanten Skripts eingefügt, dann funktioniert Ihr Code einwandfrei. –

Antwort

2

Mit ASP.NET MVC 4, RequiredIf ist nicht funktioniert, ich h ave erreicht das gleiche mit jquery unaufdringlich, fügen Sie die unten Javascript-Methode

function AddValidation() 
{ 
var showConceptOptInMessage = $("#ShowConceptOptInMessage").val(); 
    if(showConceptOptInMessage) 
{ 
    $("#ConceptEmailOptInMessage").attr('data-val-required', 'Concept Email Opt-In Message is required'); 
    $("#PrivacyPolicy ").attr('data-val-required', 'Concept Privacy Policy is required'); 
} 
    $('form').removeData('validator'); 
    $('form').removeData('unobtrusiveValidation'); 
    $.validator.unobtrusive.parse('form'); 
} 
+0

Ich habe das hinzugefügt und der 'showConceptOptInMessage'-Wert kommt als 'undefiniert'. Was fehlt mir hier? Wie diese Funktion aufgerufen wird oder was als Container übergeben wird, wenn ich so etwas mache '<% = Html.CheckBoxFor (m => m.SnapfingerOptInDefaultToChecked, new {onclick = "AddValidation()"})%> '. Oder gibt es eine andere Möglichkeit, diese Funktion beim Check-Box-Klick-Event aufzurufen? – CSharper

+0

Ich habe die Antwort editiert entfernt den Container, da Sie nicht das Div, das der Hauptdiv-Name ist, rufen Sie direkt die Dom-Elemente innerhalb der Methode, dh AddValidation() {$ ("# ShowConceptOptInMessage"). Val() } – Thejaswy

+0

Das habe ich herausgefunden, aber Problem ist, sobald ich das Feld überprüfen, es funktioniert, aber wenn ich es deaktiviert, sollten diese Validierungen entfernt werden, die nicht passiert. Ich habe versucht, $ ("#ConceptEmailOptInMessage"). ATTR ("Daten-val-erforderlich", "Concept Email Opt-In Message ist erforderlich", true); '&' $ ("#ConceptEmailOptInMessage"). ATTR ('Daten -val-required ',' Concept Email Opt-In Nachricht ist erforderlich ', false); 'was nicht funktioniert – CSharper