2017-07-18 140 views
0

配列をループしてフォーム要素を生成しています。だから私は配列= ["名前"、 "年齢"]と私は各項目をループし、適切な名前と関連するデータを持つテキストボックスを作成します。ASP.NET MVC:ValidationMessageForを動的に作成

そこで私は、動的な

<input class="input-validation-error text-box single-line" data-val="true" data-val-required="@arr[i] is required" id="@arr[i]" name="@arr[i]" type="text" value=""> 
<span class="field-validation-error" data-valmsg-for="@arr[i]" data-valmsg-replace="true"></span> 

の代わりにというのが私のフォーム要素を作成する:このために、クライアント側のメッセージが生成されていない、しかし

@Html.EditorFor(model => model.age) 
@Html.ValidationMessageFor(model => model.age) 

。サーバー側の検証ではエラーが発生しますが、クライアント側では処理が中止されます。

enter image description here

がどのように私はコードの行を吹いにモデルのプロパティ名を動的に提供することができるように、動的にフォームを作成する能力を維持しながら、クライアント側のメッセージが仕事を得ることができますか?方法はありますか?

@Html.EditorFor(model => model[@arr[i]]) 
@Html.ValidationMessageFor(model => model[@arr[i]]) 

上記のコードは機能しませんが、私が解決策で探しているものを強調することがわかります。

答えて

1

インラインまたはJavaScriptを使用して、検証を明示的に登録する必要があります。

More jQuery Validate Examples(以下は簡単な例です)

$("#myform").validate({ 
    rules: { 
    name: "required" 
    } 
}); 

インライン例:

<input id="age" name="age" required /> 
0

これは動作します:

@model Testy20161006.Controllers.MessageViewModel 
@{ 
    Layout = null; 
} 

<!DOCTYPE html> 
<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>IndexStackOverflow900</title> 

</head> 
<body> 
    <div> 
     @using (Html.BeginForm()) 
     { 
      int i = 0; 
      foreach (var arr in Model.myArray) 
      { 
       <input class="input-validation-error text-box single-line" data-val="true" 
         data-val-required="@arr is required" [email protected] [email protected] type="text" value=""> 
       <br /> 
       @Html.ValidationMessage(arr); 
       i++; 
      } 

      <input type="submit" value="submit" /> 
     } 
    </div> 
</body> 
</html> 

コントローラ/モデル:

public class MessageViewModel 
{ 
    public List<string> myArray = new List<string>(); 
    [Required] 
    public string name { get; set; } 
    [Required] 
    public string age { get; set; } 
} 

public class HomeController : Controller 
{ 
    [HttpPost] 
    public ActionResult IndexStackOverflow900(MessageViewModel mvm) 
    { 
     if (ModelState.IsValid) 
     { 
     } 
     else 
     { 
      //you can narrow it down to which field caused the error by inspecting ModelState 
      //List<ModelErrorCollection> errors = controller.ModelState.Select(x => x.Value.Errors) 
      //   .Where(y => y.Count > 0) 
      //   .ToList(); 
      ModelState.AddModelError("name", "name is required"); 
      ModelState.AddModelError("age", "age is required"); 
     } 

     FactorCode(mvm); 
     return View(mvm); 
    } 

    public ActionResult IndexStackOverflow900() 
    { 
     MessageViewModel mvm = new MessageViewModel(); 
     FactorCode(mvm); 
     return View(mvm); 
    } 

    public void FactorCode(MessageViewModel mvm) 
    { 
     mvm.myArray.Add("name"); 
     mvm.myArray.Add("age"); 
    } 
関連する問題