6

ユーザーアカウントを作成するためのフォームを使用したMVC4インターネットアプリケーションがあります。フォームの検証は機能しますが、入力が検証に失敗している間はエラーメッセージは表示されません。使用されるモデルは、エンティティモデルで検証問題が解決されるまで、それはまだ提出防止するが、何のテキストクライアントの検証でメッセージが表示されない

レイザービューフォーム

<h2>Create New Account</h2> 
<fieldset> 
    <legend></legend> 
    @using (Html.BeginForm("CreateUser",null)){ 
     @Html.AntiForgeryToken() 
     <table class="create"> 
      <tr> 
       <td colspan="2"><b>New Account</b> 
      </tr> 
      <tr> 
       <td>@Html.DisplayNameFor(model=>model.UserName)</td><td>@Html.TextBoxFor(model=>model.UserName)</td> 
       <td>@Html.DisplayNameFor(model=>model.EmailAddress)</td><td>@Html.TextBoxFor(model=>model.EmailAddress)</td> 
       <td><input type="submit" value="Create User" /></td> 
      </tr> 
     </table> 
    } 
</fieldset> 
    @Html.ValidationSummary() 

がありません使用バンドルは

bundles.Add(new ScriptBundle("~/bundles/asset").Include(
      "~/Scripts/jquery-{version}.js", 
      "~/Scripts/jquery-ui-{version}.js", 
      "~/Scripts/jquery.validate*", 
      "~/Scripts/jquery.unobtrusive*")); 

検証ファイルを含めます、私は検証要件に注釈を付けるための部分クラスを追加しました。

[MetadataType(typeof(UserProfileMetadata))] 
public partial class UserProfile 
{ 
    //Empty Class just required for adding class level attribute 
} 

public class UserProfileMetadata 
{ 
    //Fields from user profile requiring annotations 
    [EmailAddress] 
    [Required] 
    [Display(Name = "Email Address")] 
    public string EmailAddress { get; set; } 

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

} 

妥当性検査は動作していますが、今メッセージを表示すると、マークアップエラーでなければならないと思いますが、私はそれを見ることができません。

+3

は、フォームに検証要約を移動しようとしたがありますか?また、submitmentsがクリックされるまで、validationsummaryには結果が入力されません – Slicksim

+0

* facepalm *はい、問題はフォームの外に要約があります。解決策としてそれを打ちなさい、私はそれを受け入れる。約40分それを見て、ちょうどそれを見ていない! – James

+0

私は同じ自分をやった、私はいつも私の顔の手のひらから黒い目を取得します:) – Slicksim

答えて

13

フォーム内でValidationSummaryを移動すると修正されます。すなわち、それは_Layout.cshtmlに住んでいる、とあなたはそこにそれが好き、フォームに@Html.ValidationSummaryを移動に制限されたくない方、この全体につまずく誰のための

<h2>Create New Account</h2> 
<fieldset> 
    <legend></legend> 
    @using (Html.BeginForm("CreateUser",null)){ 
     @Html.ValidationSummary() 
     @Html.AntiForgeryToken() 
     <table class="create"> 
      <tr> 
       <td colspan="2"><b>New Account</b> 
      </tr> 
      <tr> 
       <td>@Html.DisplayNameFor(model=>model.UserName)</td> <td>@Html.TextBoxFor(model=>model.UserName)</td> 
      <td>@Html.DisplayNameFor(model=>model.EmailAddress)</td><td>@Html.TextBoxFor(model=>model.EmailAddress)</td> 
      <td><input type="submit" value="Create User" /></td> 
     </tr> 
    </table> 
} 
</fieldset> 
5

、ここではそれを回避する方法です。

以下の方法は、明らかに、マイクロソフトが@Html.ValidationSummaryを埋め込むために使用するものです。標準形式ではdata-valmsg-summary-true$('this')に探します。この場合はthisが呼び出しフォームです。まあ、私の@Html.ValidationSummaryは、DRYを保つために_Layout.cshtmlのpageBody<div>に住んでいます。これに

var container = $('this').find("[data-valmsg-summary=true]") 

function onErrors(event, validator) { // '#pageBody' is the containing element 
    var container = $('#pageBody').find("[data-valmsg-summary=true]"), 
    list = container.find("ul"); if (list && list.length && validator.errorList.length) { 
     list.empty(); container.addClass("validation-summary-errors").removeClass("validation-summary-valid"); 
     $.each(validator.errorList, function() { 
      $("<li />").html(this.message).appendTo(list); 
     }); 
    } 
} 

はこれまでのところ、私はこれだけ変更した今

var container = $('#pageBody').find("[data-valmsg-summary=true]") 

を、私はボタンのクリックからの私の検証をトリガーします。

$('#btnSave').click(function() { 
     if ($('form').valid()) { 
      // Do stuff 
     } else { 
      onErrors(event, $('form').data('validator')); 
     } 
    }); 

ほら、@ Html.ValidationSummary jQuery.unobtrusiveを用いた場合であっても移入:火災にonErrors(event, validator)を取得するには、私は次のjQueryを使用していました。

ここで正しい方向に私を指しているためLeniel Macaferiに大きな感謝: http://www.leniel.net/2013/08/customizing-aspnet-mvc-html-validation-summary-with-bootstrap-3-panel.html#sthash.jGRguVuV.qSjYUlhS.dpbs

関連する問題