2017-04-01 3 views
0

J'utilise tuples pour charger plusieurs modèles dans une vue.ASP.NET MVC Erreurs de validation ne pas afficher

La vue est comme

@using (Ajax.BeginForm(null, null, ajaxOptions, new { @class = "contact-form" })) 

     { 
      @Html.AntiForgeryToken() 
      <div class="form-group form-group--xs"> 
       @Html.TextBoxFor(m => m.Item2.Email, new { @class = "form-control input-sm", placeholder = "Your email address..." }) 
       @Html.ValidationMessageFor(m => m.Item2.Email) 
      </div> 
      <div class="form-group form-group--xs"> 
       @Html.TextAreaFor(m => m.Item2.Message, new { @class = "form-control input-sm", placeholder = "Your message...", rows = "4" }) 
       @Html.ValidationMessageFor(m => m.Item2.Message) 
      </div> 

      <input type="submit" class="btn btn-primary-inverse btn-sm btn-block" value="Send Your Message" /> 
     } 

Le contrôleur est

 [HttpPost] 
     [ValidateAntiForgeryToken] 
     public async Task<PartialViewResult> Submit([Bind(Prefix = "Item2")] ContactForm model) 
     { 
      bool isMessageSent = true; 

      if (ModelState.IsValid) 
      { 
       try 
       { 
        await Services.EmailService.SendContactForm(model); 
       } 
       catch (Exception ex) 
       { 
        isMessageSent = false; 
       } 
      } 
      else 
      { 
       isMessageSent = false; 
      } 
      return PartialView("_SubmitMessage", isMessageSent); 
     } 

et le formulaire de contact est

public class ContactForm 
    { 
     [Required(ErrorMessage = "You must provide your email."), EmailAddress] 
     public string Email { get; set; } 

     [Required(ErrorMessage = "You must include a message.")] 
     public string Message { get; set; } 
    } 

Enfin, la vue partielle est

@model bool 

@if (Model) 
{ 
    <div style="color:#c2ff1f">Your message has been sent.</div> 
} 
else 
{ 
    <div style="color:#f34141">An error occured while sending your message</div> 
} 

Mise à jour: Le rendu HTML pour la zone de texte électronique est

<input class="form-control input-sm" 
data-val="true" 
data-val-email="The Email field is not a valid e-mail address." 
data-val-required="You must provide your email." 
id="Item2_Email" 
name="Item2.Email" 
placeholder="Your email address..." 
type="text" 
value=""> 

Si je ne rentre pas de texte dans le champ e-mail ou le champ de message, le message n'est pas envoyé :) mais je n'ai aucune validation erreurs dans la vue :( Qu'est-ce que je fais mal ici?

+0

Je ne suis pas sûr, mais je pense que ce serait mieux si vous retournez une vue au lieu d'une vue partielle. Vous arrivez à l'écran où il affiche qu'une erreur s'est produite lors de l'envoi de l'e-mail. Je pense que c'est suffisant quand vous insérez "return View();" dans le bloc d'autre du contrôleur. – Larce

+0

@Larce Modifié pour la tâche publique asynchrone et retour (modèle); mais ça ne fonctionne pas comme prévu – OrElse

+0

Que se passe-t-il alors? Est-ce que vous arrivez toujours à la vue partielle? – Larce

Répondre

1

Je suppose que je besoin d'une pause. Il me manquait

@Scripts.Render("~/bundles/jqueryval") 
0

Vous renvoyez un partialView qui n'a pas le code de message d'erreur de validation.

Essayez ce code:

 [HttpPost] 
     [ValidateAntiForgeryToken] 
     public async Task<PartialViewResult> Submit([Bind(Prefix = "Item2")] ContactForm model) 
     { 
      bool isMessageSent = true; 

      if (ModelState.IsValid) 
      { 
       try 
       { 
        await Services.EmailService.SendContactForm(model); 
       } 
       catch (Exception ex) 
       { 
        isMessageSent = false; 
       } 

      } 
      else 
      { 
       isMessageSent = false; 
       //Return the view that has validation error message display code. 
       return View(model); 
      } 
      return PartialView("_SubmitMessage", isMessageSent); 
     } 
+0

Bonjour, puis-je retourner à la fois PartialViewResult et ViewResult à partir du même contrôleur? – OrElse

+1

Si vous renvoyez actionResult. Oui! –

+0

Pourriez-vous s'il vous plaît vérifier la mise à jour? – OrElse