2016-07-27 15 views
1

タイトルで言うように、私はRegExとすべてでこの検証を機能させるためにすべてをやっていますが、うまく動作しません。私はここで間違って何をしていますか?あなたは、フォームでまったくデータを入力する必要がいけないASP.NET MVCでフォームを検証するC#

は、あなたはまだ、空メールを送信することができ、私はそれを望んではいけない...

モデル:

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

ビュー:

@{ 
    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> 

コントローラー:

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

メールが送信されたときにポップアップメッセージが表示されますが、それ以外の方法はありません。

答えて

0

あなたのビューモデルは、必須のデータ注釈で装飾されています。したがって、組み込みモデルの検証を使用することができます。

あなたのビューに曖昧なメッセージを表示するための関連コードがあることを確認してください。必要に応じて、ValidationSummaryまたはValidationForヘルパーメソッドを使用できます。 htmlヘルパーメソッドを使用して入力フィールドをレンダリングすることもできます。ヘルパーは、検証エラーメッセージを表示するために必要なマークアップを生成します。

@model SendMail  
@using(Html.BeginForm()) 
{ 
     @Html.LabelFor(s=>s.Name) 
     @Html.TextBoxFor(s=>s.Name) 
     @Html.ValidationMessageFor(t => t.Name) 

     @Html.LabelFor(s=>s.Email) 
     @Html.TextBoxFor(s=>s.Email) 
     @Html.ValidationMessageFor(t => t.Email) 

     @Html.LabelFor(s=>s.Number) 
     @Html.TextBoxFor(s=>s.Number) 
     @Html.ValidationMessageFor(t => t.Number) 

     @Html.LabelFor(s=>s.Message) 
     @Html.TextAreaFor(s=>s.Message) 
     @Html.ValidationMessageFor(t => t.Message) 

     <input type="submit" /> 
} 

また、PRGパターン(ポストリダイレクト-GET)に従うことをお勧めします。そのため、同じビューに戻る代わりに、別のGETアクションにリダイレクトされます。

return RedirectToAction("EmailSent"); 
+0

多くのコードを変更しなくても簡単な方法はありませんか? – Malphai

+0

検証メッセージを表示するには、そのコードを追加する必要があります。 – Shyju

0

あなたが関数内で他のプロパティについて

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

と同様のビルドを使用することを検討すべきであるクライアント側の検証(jQueryのヴァル)を使用します。

彼らは空

ある場合、これはその後、サーバー側で使用すると、その有効でない場合は、電子メールを送信してから、サーバーを停止する

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

をしたいフォームを送信からユーザーを停止します

+0

多くのコードを変更しなくても簡単な方法はありませんか? – Malphai

+0

@Malphaiでは、手動でデータタグを追加することができます。 data-val = "true"のようなものdata-val-required =検証する3つのフィールドには "このフィールドは必須"で、サーバー側でのみModelStateの変更が必要です – Steve

0

データアノテーション(あなたのビューモデルで[必須]タグ)を使用しているので、あなたの問題を解決するためにあまりにも多くの情報を追加する必要はありません。

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

にModelStateがあることから、コードの残りの部分を防ぐことができますされ、着信データがnullでない場合にのみ有効となります:あなたのコントローラに以下を追加し、空白の電子メールを送信するから、それを防止するために

届いた(そして電子メールを送る)。 ModelStateにチュートリアルhereがあり、読む価値があります。このチュートリアルでは、カスタムバリデータの追加についても説明します。カスタムバリデータは、提供されたMVCデータアノテーションの外で検証が必要な場合に便利です。

ユーザーに情報を入力する際のフィードバックを提供するために、確認メッセージと確認をお勧めします。これらは、[必須]タグが追加されたのと同じ方法であなたのモデルに追加することができます。

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

を(あなたがそれを使用して言及したので)また、検証メッセージと一緒に、ここでの正規表現を追加することができます。

[Required] 
[RegularExpression(@"^\d{0,4}+.\d{0,8}$", ErrorMessage = "Entry must be in the form of a decimal with no more than eight places to the right of the period.")] 
public Decimal DecimalThingie { get; set; } 

副詞として、使用する前に正規表現の正当性をチェックしたい場合、Visual StudioにはNugetから取り込めるいくつかの組み込みツールがあります。

あなたはユーザー入力用のフォームグループで、あなたのビューに直接検証チェック/メッセージを追加します。

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

HTMLヘルパーValidationMessageForには、モデルを見て、あなたがリストされてきたメッセージをつかむだろうユーザーがページを投稿しようとしたときに表示されます。あなたのモデル変数とModelStateチェックの他のデータアノテーションと一緒に、フィールドがあなたのチェックに合ったコンテンツを持っていて、何かが過去になった場合にコントローラメソッドの残りの部分が実行されないようにするまで、あなたの小切手。

ます。また、(あなたがそれで引数をカスタマイズする必要があります)検証の失敗の要約を提供するために、あなたのビューに以下を追加したいと思う:

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

ビューを返すようにしたくありませんあなたの方法の終わりに - あなたはRedirectToActionメソッドを使用する必要があります:

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

RedirectToActionコマンド明示的にビューコントローラを介して実行を強制します。

データアノテーションは非常に柔軟性があり、それらを使用すると、受信したデータのすべてのチェックを自分で書き込むよりも、比較的少ないコードを書くことになります。このドキュメントは、MSDNのドキュメントにあり、MVCシステムに組み込まれています。

MVCシステム内のエラー(Htmlエラーではありません)のエラー処理中に行う操作をより詳細に制御するには、MVCメソッドOnExceptionをオーバーライドできますが、コード処理がかなり複雑になります。どのように、なぜ、なぜ、良いチュートリアルが見つかりますhere

しかし、この問題について私が助言するのは、あなた自身で書くのではなく、Elmahパッケージを利用することです。 ELMAHは、内蔵のNugetパッケージマネージャは、次のコマンドを使用して経由でつかんすることができます簡単にエラーログや管理ができるようになります

PM> Install-Package Elmah.MVC 

のインストール、およびフィルタを管理することとにルーティングすることなく、そのプロセスのかなりのカスタマイズが可能あなた自身の。