2017-04-17 3 views
0

Mon application nécessite la possibilité d'envoyer des e-mails sur plusieurs vues. J'essaie d'utiliser un composant View pour pouvoir réutiliser ma logique à plusieurs endroits. Lorsque l'utilisateur clique sur le bouton Envoyer, je ne souhaite pas actualiser la vue entière ... Je souhaite valider le formulaire et afficher les erreurs de modèle, sinon envoyer l'e-mail.Afficher les composants et les validations côté serveur Ajax

La configuration ci-dessous fonctionne très bien pour la validation côté client, mais je ne suis pas sûr de savoir comment restaurer le côté serveur des erreurs de modèle et les afficher dans la vue. Toute aide est appréciée.

Default.cshtml (vue des composants - en utilisant jquery-ajax-discret)

@model EmailViewModel 
<div id="Email"> 
    <div class="row section-buffer"> 
     <div class="col-sm-12"> 
      <span class="section-header">Email</span> 
     </div> 
    </div> 
    <hr /> 
    <form id="EmailForm" 
      method="post" 
      class="form-horizontal" 
      asp-controller="Email" 
      asp-action="Send" 
      data-ajax="true" 
      data-ajax-method="POST" 
      data-ajax-success="sendEmailSuccess" 
      data-ajax-failure="sendEmailFailure(xhr, status, error)" 
      data-ajax-update="Email"> 

     <div class="form-group form-group-sm"> 
      <label class="description-label col-sm-3" asp-for="From"></label> 
      <div class="col-sm-9"> 
       <input class="form-control" asp-for="From" /> 
       <span asp-validation-for="From" class="text-danger"></span> 
      </div> 
     </div> 
     <!-- remaining fields omitted --> 
     <div class="form-group form-group-sm"> 
      <div class="col-sm-9 col-sm-offset-3"> 
       <button type="submit" class="btn btn-primary">Send</button> 
      </div> 
     </div> 
    </form> 
</div> 

EmailViewModel

public class EmailViewModel 
{ 
    [Required] 
    public string From{ get; set; } 
    //remaining properties omitted 
} 

EmailController

[HttpPost] 
[Route("/email/send")] 
public ActionResult Send(EmailViewModel viewModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     //how do return my model errors back to my View Component? 
    } 
    else 
    { 
     //do send logic here 
     return Content("Success"); 
    } 
} 

Répondre

0

Conserver erreur dans ViewBag

@model EmailViewModel 
<div id="Email"> 
    <div class="row section-buffer"> 
     <div class="col-sm-12"> 
      <span class="section-header">Email</span> 
     </div> 
    </div> 
<div>@ViewBag.Error</div> 
    <hr /> 
    <form id="EmailForm" 
      method="post" 
      class="form-horizontal" 
      asp-controller="Email" 
      asp-action="Send" 
      data-ajax="true" 
      data-ajax-method="POST" 
      data-ajax-success="sendEmailSuccess" 
      data-ajax-failure="sendEmailFailure(xhr, status, error)" 
      data-ajax-update="Email"> 

     <div class="form-group form-group-sm"> 
      <label class="description-label col-sm-3" asp-for="From"></label> 
      <div class="col-sm-9"> 
       <input class="form-control" asp-for="From" /> 
       <span asp-validation-for="From" class="text-danger"></span> 
      </div> 
     </div> 
     <!-- remaining fields omitted --> 
     <div class="form-group form-group-sm"> 
      <div class="col-sm-9 col-sm-offset-3"> 
       <button type="submit" class="btn btn-primary">Send</button> 
      </div> 
     </div> 
    </form> 
</div> 

Retour Voir avec l'erreur

[HttpPost] 
[Route("/email/send")] 
public ActionResult Send(EmailViewModel viewModel) 
{ 
    if (!ModelState.IsValid) 
    { 
     //how do return my model errors back to my View Component? 
     return Content(string.Join("; ", ModelState.Values 
            .SelectMany(x => x.Errors) 
            .Select(x => x.ErrorMessage))); 
     //in send email success javascript method handle this message and show. 

    } 
    else 
    { 
     //do send logic here 
     return Content("Success"); 
    } 
} 
+0

Je ne veux pas retourner un message que je produis. Je veux retourner les validations du modèle. Merci pour la réponse si. –

+0

Je viens de garder un exemple de message, vous pouvez retourner tout ce dont vous avez besoin – Krishna

+0

'return View()' ne fonctionne pas car Send.cshtml n'existe pas. Ma vue Component View est nommée Default.cshtml (convention) et existe dans Shared/Components/Email. –