Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC:动态创建ValidationMessageFor_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# ASP.NET MVC:动态创建ValidationMessageFor

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="

我通过循环数组来生成表单元素。所以我有一个数组=[“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="">
 <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");
    }