C# ASP.NET MVC:动态创建ValidationMessageFor
我通过循环数组来生成表单元素。所以我有一个数组=[“name”,“age”],我循环每个项目,并创建一个包含适当名称和相关数据的文本框 因此,我动态创建表单元素,以便C# ASP.NET MVC:动态创建ValidationMessageFor,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我通过循环数组来生成表单元素。所以我有一个数组=[“name”,“age”],我循环每个项目,并创建一个包含适当名称和相关数据的文本框 因此,我动态创建表单元素,以便 <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="
<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[@arr[i]])
@Html.ValidationMessageFor(model => model[@arr[i]])
我知道上面的代码不起作用,但它只是为了强调我在解决方案中寻找的东西。您需要显式注册内联验证或使用JavaScript进行验证 (以下是一个简单的例子) 内联ex:
<input id="age" name="age" required />
这项工作:
@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" id=@arr name=@arr type="text" value="">
<br />
@Html.ValidationMessage(arr);
i++;
}
<input type="submit" value="submit" />
}
</div>
</body>
</html>
@model testy2016 1006.Controllers.MessageViewModel
@{
布局=空;
}
IndexStackOverflow900
@使用(Html.BeginForm())
{
int i=0;
foreach(Model.myArray中的var arr)
{
@Html.ValidationMessage(arr);
i++;
}
}
控制器/型号:
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");
}
公共类MessageViewModel
{
public List myArray=new List();
[必需]
公共字符串名称{get;set;}
[必需]
公共字符串年龄{get;set;}
}
公共类HomeController:控制器
{
[HttpPost]
public ActionResult IndexStackOverflow900(MessageViewModel mvm)
{
if(ModelState.IsValid)
{
}
其他的
{
//您可以通过检查ModelState将其缩小到导致错误的字段
//List errors=controller.ModelState.Select(x=>x.Value.errors)
//.其中(y=>y.计数>0)
//.ToList();
AddModelError(“名称”,“需要名称”);
AddModelError(“年龄”,“年龄是必需的”);
}
因子码(mvm);
返回视图(mvm);
}
公共行动结果索引StackOverflow900()
{
MessageViewModel mvm=新建MessageViewModel();
因子码(mvm);
返回视图(mvm);
}
公共无效系数代码(MessageViewModel mvm)
{
mvm.myArray.Add(“名称”);
mvm.myArray.Add(“年龄”);
}
谢谢@kblau当我试图使用foreach(Model.Round.Matches中的var项)在一个表单中更新多个记录并将@Html.ValidationMessage(arg);
替换为@Html.ValidationMessage($”Round.Matches[{item.ID}].HomeTeamID')
正是我所需要的。
@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" id=@arr name=@arr 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");
}