2016-04-12 9 views
-1

ビューの入力モデルフィールドに表示される検証エラーメッセージが表示されないようです。検証は実行されますが、失敗した場合はメッセージは表示されません。私は何が欠けていますか? MVC 5 Razor

上記[必須]タグは、[説明]入力によってModelStateが無効になりますが、送信を停止しません。私はモデル状態をチェックすることでそれをキャッチする必要があります。いくつかの.jsファイルがありませんか?私はこれを二重チェックする例はありません。

はここに私のモデルである(私は今のところ唯一の[必須]を持って注意してください):

public partial class Requests 
{ 
    public int RequestID { get; set; } 
    public string NickName { get; set; } 
    public Nullable<double> Lat { get; set; } 
    public Nullable<double> Lng { get; set; } 
    public string ZipCode { get; set; } 
    [Required(ErrorMessage = "Description of what you need is missing.")] 
    public string Description { get; set; } 
    public System.DateTime DateCreated { get; set; } 
} 

はここで説明入力が入力を必要とする私の見解です。ここで

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

私のコントローラのActionResult(ダウンskinnied)ModelState失敗した

if (ModelState.IsValid) 
{ 
//THIS ALL WORKS IF Description HAS INPUT 

} 
else 
{ 
    TempData["Saved"] = "Nothing saved yet. Look for reason."; 
return RedirectToAction("StoreRequests", new { lat = requests.Lat, lng = requests.Lng }); 
} 

ユーザーが正しいビューを対象とTempDataは何も保存されていなかったことを示していますさ。ただし、違反入力の下のビューにはエラーメッセージが表示されず、ビューの一番上にはValidationSummaryがありません。また、入力ミスで送信が停止されることはありません。

@if(TempData["Saved"] != null) 
{ 
    <span style="color: red;">@TempData["Saved"].ToString()</span> 
} 
<hr /> 
@Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
+0

ステファンありがとうございます。私はこれら2を加えて、それは働いた。おそらく、_Layout.cshtmlにもっとカップルがあったでしょう。 "スクリプトのsrc =" @ Url.Content( "〜/ Scripts/jquery.validate.min.js" "jquery.validate.unobtrusive.min.js") "type =" text/javascript "> あなたが答えをしたいのなら、私はそれを受け入れます。 – JustJohn

+0

なぜ私はダウン投票を得たか分かりません。ああよく – JustJohn

答えて

1

クライアント側の検証を取得する(したがって、その無効の場合は提出されているフォームを防ぐ)するために、あなたはあなたの中に次のスクリプトを含める必要がありビュー(またはレイアウト)。あなたが新しいプロジェクトを作成するとき、あなたは、単に他にビュー

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

に以下を追加することができますVSによって設定されたデフォルトの束を持っている場合はModelState場合

jquery-{version}.js 
jquery.validate.js 
jquer.validate.unobtrusive.js 

、あなたはリダイレクトすべきではありません無効ですが、現在のビューを返します。ユーザーがjavascriptを無効にしていても検証エラーは表示されます。リダイレクトすることで、あなたの失うことが現在のModelStateになるので、あなたのリダイレクト先のビューには検証エラーは表示されません。ユーザーが以前に入力したデータ(2つのパラメータを除いて)は失われません。

public ActionResult Edit (Requests model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 
    // save you data and redirect 
} 
+0

いいえ私はあなたの時間スティーヴンを無駄にしたくない。あなたは私にとって非常に多くのことを解決しました。申し訳ありません、私はとても長い時間をかけました。私はちょうどコンピュータから私を遠ざけた他のものを持っていた。 – JustJohn

+0

On ModelState Invalid前のビューに戻りますが、TempDataにエラーメッセージを送信し、同じLat/Lngsを送信してGoogleマップに再度データを入力しています。たぶん、ぼんやりした方法がありますが、100万年後に私の道が崩壊するのではないかと疑っています。 – JustJohn

+0

@JustJohn、あなたはそれのために 'TempData'を使うべきではありません。 'ModelState'エラーを追加してビューを返すだけです。 'ModelState。AddModelError( ""、 "まだ保存されていません。理由を探してください。"); View(model);を返し、それは '@ Html.ValidationSummary()'に表示されます。しかし、そのポイントは何ですか? 'ModelState'が無効でビューを返すと、すべてのエラーメッセージは' @ Html.ValidationFor(m => m.yourProperty) 'に表示されます。 'ModelState'が無効な場合は、決してリダイレクトするべきではありません。 –

0

はあなたの.cshtmlファイルに直接、次の必要scripts含めます。

<script src="/Scripts/jquery.unobtrusive-ajax.js"></script> 
<script src="/Scripts/jquery.validate.js"></script> 
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>