2017-07-18 66 views
0

我通過在數組上循環來生成我的表單元素。所以我有一個數組= [「名稱」,「年齡」],我循環每個項目,並創建一個適當的名稱和相關數據的文本框。ASP.NET MVC:爲動態創建ValidationMessage

因此我創建動態地使得

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