0

MVC検証保証型検証パッケージ(MVC Foolproof Validation)を使用しています。モデルが無効な場合にMVCクライアント側の検証の要約が表示されない

他のモデルプロパティが空の場合は、trueにする必要があります。 IDフィールドと場所フィールドが空のままになっている場合、ModelStateが正しく無効に設定されているため、検証部分が機能します。 ModelState配列のエラーを調べると、私はその動作を見ることができます。

私の問題は、クライアント側の検証サマリが表示されないことです。ここで私はものを設定している方法です。誰も私の問題を見つけることができますか?私の見解では

[DisplayName("Image Id")] 
    public string Id{ get; set; } 

    [DisplayName("Location Id")] 
    [RequiredIfEmpty("Id", ErrorMessage = "You must..etc"] 
    public string LocationId{ get; set; } 

私はモデルの状態をチェックしています私のコントローラのアクションで

<div class="form-horizontal"> 
    <hr/> 
    @Html.ValidationSummary(true, "", new {@class = "text-danger"}) 

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

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

を次のように私は、検証の概要と入力を設定しています。 ModelState.AddModelError(..)を呼び出す必要がありますか?私はそれを試みましたが、おそらく私はそれを呼び出す必要がある方法があります。

[HttpPost] 
    public ActionResult Search(SearchCriteria searchCriteria) 
    { 
     var searchViewModel = new SearchViewModel 
     { 
      SearchCriteria = searchCriteria 
     }; 

     if (ModelState.IsValid) 
     { 
      ... 
     } 
     //ModelState.AddModelError("LocationId", "test"); 
     return View(searchViewModel); 
    } 
+0

'@ Html.ValidationSummary(true、..)は、プロパティレベルのエラーを除外します。しかし '@ Html.ValidationMessageFor(model => model.SearchCriteria.LocationId、...)'は、 'Id'が' null'ならばその位置にエラーメッセージを表示し、 LocationId'。これを正しく設定しておけば、エラーメッセージが表示され、コントローラーメソッドに当てはまるという事実によって他の問題が示唆されますので、フォームは送信できません。 –

+0

そして、メソッドのパラメーターあなたのビュー内のモデルが '@model SearchCriteria 'ではないと思われるときは' SearchCriteria'です。さらに多くの問題を示唆しています –

答えて

0

私の問題は、自分の行動に私の呼び出しは、AJAXを介して行われていたということでした。私は本当に指定したはずですが、ここで助けてくれた人々はすぐに問題を診断していました。 modelstateが無効だったときに私は新しいView(searchViewModel)を返していましたが、jsonのエラーを返すように更新しなければなりませんでした。

[HttpPost] 
    public ActionResult Search(SearchCriteria searchCriteria) 
    { 
     if (ModelState.IsValid) 
     { 
      var searchResults = _searchProvider.GetData(searchCriteria); 

      return Json(new 
      { 
       searchResults 
      }, JsonRequestBehavior.AllowGet); 
     } 

     string errorMessages = string.Join(" <br /> ", this.ModelState.Values 
      .SelectMany(v => v.Errors) 
      .Select(e => e.ErrorMessage)); 

     return this.Json(new { HasError = true, ErrorMessages = errorMessages }); 
    } 
0

変更falseへのValidationSummaryヘルパーラインのbooleanパラメータ(excludePropertyErrors):

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

参照https://msdn.microsoft.com/de-de/library/ee839464(v=vs.118).aspx

+0

これは何の違いもありませんでした。私は、検証の要約が表示されていないことを示す必要があります。また、どちらかを示すコントロールの下にある検証エラーメッセージも表示されません。 – user48408

+0

ビューモデルクラスの一貫性のない使用と関係する可能性があります。ビューで 'model.SearchCriteria.LocationId'を使うと、コントローラは' SearchCriteria'パラメータを取得します。それは奇妙に思える。あなたのビューとコントローラで 'SearchCriteria'だけを試してみることができますか? –

+0

私は従いません。 Viewにはいくつかのプロパティを持つモデルがあり、それらのプロパティのそれぞれには、データ注釈で指定された独自の検証基準があります。 – user48408

関連する問題