2016-07-27 16 views
1

So wie der Titel sagt, ich mache alles, um diese Validierung zu funktionieren, mit RegEx und alle, aber es wird einfach nicht funktionieren. Was mache ich hier falsch?Validieren Formular in ASP.NET MVC C#

Sie brauchen nicht auf alle in der Form keine Daten eingeben, können Sie immer noch eine leere Mail senden, und ich nicht will, dass ...

Modell:

using System.ComponentModel.DataAnnotations; 

namespace DK_Design.Models 
{ 
    public class SendMail 
    { 
     [Required] 
     public string Name { get; set; } 

     [Required] 
     public string Email { get; set; } 

     public string Number { get; set; } 

     [Required] 
     public string Message { get; set; } 
    } 
} 

Ausblick:

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<div class="container"> 
    <div class="row"> 
     <div class="box"> 
      <div class="col-lg-12"> 
       <hr> 
       <h2 class="intro-text text-center"> 
        Kontakta 
        <strong>Oss!</strong> 
       </h2> 
       <hr> 
      </div> 
      <div class="col-md-8"> 

      </div> 
      <div class="col-md-4"> 
       <p> 
        Telefon: 
        <strong>123.456.7890</strong> 
       </p> 
       <p> 
        Email: 
        <strong><a href="mailto:*****@live.se">*****@live.se</a><!--I am obviously blurring the email on purpose here. The email function itself works.--> </strong> 
       </p> 
       <p> 
        Address: 
        <strong> 
         3481 Melrose Place 
         <br>Beverly Hills, CA 90210 
        </strong> 
       </p> 
      </div> 
      <div class="clearfix"></div> 
     </div> 
    </div> 

    <div class="row"> 
     <div class="box"> 
      <div class="col-lg-12"> 
       <hr> 
       <h2 class="intro-text text-center"> 
        Skicka 
        <strong>Ett Meddelande</strong> 
       </h2> 
       <hr> 
       @if (ViewData["Message"] != null) 
       { 
        <div class="alert alert-success">Ditt e-mail har skickats!</div> 
       } 
       @if (ViewData["Message"] == null) 
       { 
        <div class="alert alert-danger">Ditt e-mail kan inte skickas!</div> 
       } 
       <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugiat, vitae, distinctio, possimus repudiandae cupiditate ipsum excepturi dicta neque eaque voluptates tempora veniam esse earum sapiente optio deleniti consequuntur eos voluptatem.</p> 
       <form class="form-wrapper" id="contact-form" method="post" role="form" novalidate> 
        <div class="form-group"> 
         <div class="row"> 
          <div class="form-group col-lg-4"> 
           <label for="name"> 
            Namn * 
           </label> 
           <input type="text" id="name" name="name" class="form-control" data-errmsg="Name is required." 
             placeholder="Ditt Namn" required /> 
          </div> 
         </div> 
        </div> 
        <div class="form-group"> 
         <div class="row"> 
          <div class="form-group col-lg-4"> 
           <label for="email"> 
            Email * 
           </label> 
           <input type="text" id="email" name="email" class="form-control" data-errmsg="Email is required." 
             placeholder="Ditt Email" required /> 
          </div> 
         </div> 
        </div> 
        <div class="form-group"> 
         <div class="row"> 
          <div class="form-group col-lg-4"> 
           <label for="number"> 
            Telefonnummer 
           </label> 
           <input type="text" id="number" name="number" class="form-control" 
             placeholder="Ditt Telefonnummer" /> 
          </div> 
         </div> 
        </div> 
        <div class="form-group"> 
         <div class="row"> 
          <div class="form-group col-lg-8"> 
           <label for="message"> 
            Meddelande * 
           </label> 
           <textarea id="message" name="message" class="form-control" data-errmsg="Message is required." 
              placeholder="Ditt Meddelande" rows="3" required></textarea> 
          </div> 
         </div> 
        </div> 
        <div class="row"> 
         <div class="col-md-2 col-sm-2 offset2"> 
          <input style="font-size: 20px" type="submit" id="sendMail" value="Skicka" class="btn btn-primary" /> 
         </div> 
        </div> 
       </form> 
      </div> 
     </div> 
    </div> 
</div> 

Controller:

using DK_Design.Models; 
using System.Net.Mail; 
using System.Web.Mvc; 

namespace DK_Design.Controllers 
{ 
    public class KontaktController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [HttpPost] 
     public ActionResult Index(SendMail input) 
     { 
      var mail = new MailMessage("*****", "*****"); 
      var client = new SmtpClient("smtp-mail.outlook.com"); 
      client.Port = 587; 
      client.DeliveryMethod = SmtpDeliveryMethod.Network; 
      client.UseDefaultCredentials = false; 
      var credentials = new System.Net.NetworkCredential("*****", "*****"); 
      client.EnableSsl = true; 
      client.Credentials = credentials; 
      mail.Body = input.Name + " " + input.Email + " " + input.Number + " " + input.Message; 
      mail.Subject = "Paket 1"; 
      client.Send(mail); 

      ViewData["Message"] = mail; 

      return View(mail); 

      //Blurring the email information here too ofcourse. 
     } 
    } 
} 

Ich bekomme die Erfolgsmeldung angezeigt, wenn E-Mail gesendet wird, aber nicht umgekehrt.

Antwort

0

Ihr Ansichtsmodell ist mit erforderlichen Datenanmerkungen versehen. So können Sie die integrierte Modellvalidierung verwenden.

[HttpPost] 
public ActionResult Index(SendMail input) 
{ 
    if(!ModelState.IsValid) 
     return View(input);  
    //Your existing code here which sends email 

} 

Achten Sie darauf, den entsprechenden Code zur Darstellung der vlaidation Nachrichten aus Ihrer Sicht haben. Sie können die ValidationSummary- und/oder ValidationFor-Hilfsmethoden nach Bedarf verwenden. Sie können die HTML-Hilfsmethoden auch zum Rendern der Eingabefelder verwenden. Die Helfer generieren das Markup, das benötigt wird, um Validierungsfehlermeldungen anzuzeigen.

Auch ich empfehle Ihnen, das PRG-Muster (Post-Redirect-GET) zu folgen. Anstatt also zur selben Ansicht zurückzukehren, werden Sie zu einer anderen GET-Aktion umgeleitet.

return RedirectToAction("EmailSent"); 
+0

Gibt es keinen einfacheren Weg, ohne so viel Code zu ändern? – Malphai

+0

Wenn Sie Validierungsnachrichten anzeigen möchten, müssen Sie Code dafür hinzufügen. – Shyju

0

auf Client-seitige Validierung (jquery val) verwenden, sollten Sie

@Html.TextBoxFor(m => m.Name) 

und in ähnlicher Weise für andere Eigenschaften in Funktion mit dem Build berücksichtigen.

Dadurch wird den Benutzer von Absenden des Formulars stoppen, wenn sie

Dann auf der Server-Seite leer sind Sie

if(!ModelState.IsValid) 
     return View(input); 

stoppen Sie den Server sendet die E-Mail, wenn sie nicht gültig

tun wollen
+0

Gibt es keinen einfacheren Weg, ohne so viel Code zu ändern? – Malphai

+0

@Malphai können Sie das Daten-Tag manuell hinzufügen. etwas wie data-val = "true" data-val-required = "Dieses Feld ist erforderlich" für die 3 Felder, die Sie validieren möchten, und dann würden Sie nur die Änderung von ModelState auf der Serverseite benötigen – Steve

0

Wie einige Leute schon sagten, da Sie Datenannotation (das [Required] -Tag in Ihrem Viewmodel) verwenden, ist die gute Nachricht, dass Sie nicht zu viel hinzufügen müssen, um Ihr Problem zu beheben.

Um es mehr senden leere E-Mails zu verhindern, folgendes zu Ihrem Controller hinzuzufügen:

if(!ModelState.IsValid) 
{ 
    throw some kind of error here or do something else and return 
} 

Das Model gültig sein wird, nur dann, wenn die eingehenden Daten nicht null sind, was den Rest des Codes verhindert wird entfernt, erreicht (und die E-Mail senden). Es gibt ein Tutorial here auf ModelState, das es wert ist, gelesen zu werden. Das Lernprogramm behandelt auch das Hinzufügen von benutzerdefinierten Validierungsfunktionen, die Sie möglicherweise nützlich finden, wenn Sie eine Validierung außerhalb der bereitgestellten MVC-Datenanmerkungen benötigen.

Ich würde Validierungsnachrichten und Prüfungen empfehlen, um Ihrem Benutzer Feedback zu geben, wenn sie Informationen eingeben. Diese können auf die gleiche Art und Weise zu Ihrem Modell hinzugefügt werden, die [Erforderlich] Tag hinzugefügt wurde:

[Required] 
[StringLength(8, ErrorMessage = "The input cannot be longer than 8 characters.")] 
public string StringyThingie { get; set; } 

Sie können auch Regex hinzufügen hier (da Sie erwähnt haben mit ihm), zusammen mit einer Validierungsnachricht:

Als eine Nebenbemerkung, wenn Sie die Gültigkeit Ihrer Regex überprüfen möchten, bevor Sie es verwenden, Visual Studio verfügt über mehrere integrierte Tools, die Sie über Nuget abrufen können.

Sie würden die Validierungsprüfung/Nachricht direkt an Ihrer Ansicht nach in Form Gruppe für die Eingabe Benutzer hinzufügen:

<div class="form-group"> 
    @Html.LabelFor(model => model.Field, htmlAttributes: new { @class = "control-label col-md-2"}) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Field, new { htmlAttributes = new { @class = "form-control"}} 
      @Html.ValidationMessageFor(model => model.Field, "", new { @class = "text-danger"}) 
     </div> 
    </div> 

Der HTML-Helfer ValidationMessageFor bei Ihrem Modell aussehen wird und die Nachricht greifen Sie aufgelistet haben als zur Validierung und wird angezeigt, wenn der Benutzer versucht, die Seite zu posten. Zusammen mit den anderen Datenannotationen auf Ihren Modellvariablen und einer ModelState-Prüfung verhindert es, dass der Benutzer vorwärts geht, bis die Felder Inhalt haben, der Ihren Prüfungen entspricht, und verhindern, dass der Rest der Controller-Methode ausgeführt wird, falls etwas Null vorbei ist Ihre Schecks.

Sie wollen auch die folgenden zu Ihrer Ansicht hinzuzufügen, eine Zusammenfassung der Validierungsfehler zu bieten (Sie sollten die Argumente darin anpassen):

@Html.ValidationSummary(true, "", new { @class = "text-danger"}) 

Sie wollen nicht die Ansicht zurück am Ende Ihrer Methode - sollten Sie mit der RedirectToAction Methode:

return RedirectToAction("YourMethodHere", "YourControllerHere", "YourRouteDataHere"); 

der RedirectToAction Befehl erzwingt explizit die Ausführung durch einen view-Controller.

Datenanmerkungen sind ziemlich flexibel und ihre Verwendung wird dazu führen, dass Sie vergleichsweise weniger Code schreiben, als zu versuchen, all diese Überprüfungen der eingehenden Daten selbst zu schreiben. Die Dokumentation befindet sich in der MSDN-Dokumentation und ist in das MVC-System integriert.

Für eine bessere Kontrolle über das, was es während des Fehlerprozesses für Fehler innerhalb des MVC-Systems (nicht die HTML-Fehler) tut, können Sie die MVC-Methode OnException überschreiben, aber es wird Ihren Codierungsprozess erheblich komplizieren. Ein gutes Tutorial wie und warum kann gefunden werden here.

Mein Rat an Sie zu diesem Thema wäre jedoch, das Elmah-Paket zu nutzen, anstatt zu versuchen, das selbst zu schreiben. Elmah kann über den eingebauten in Nuget Paket-Manager mit dem folgenden Befehl gepackt werden:

PM> Install-Package Elmah.MVC 

Installation, die einfache Fehlerprotokollierung und Verwaltung ermöglicht, und ermöglicht eine beträchtliche Anpassung dieses Prozesses ohne die Filter verwalten zu müssen und Routing auf dein eigenes.