C# 如何获取列表中项目的ModelState键

C# 如何获取列表中项目的ModelState键,c#,asp.net-mvc,model-view-controller,modelstate,C#,Asp.net Mvc,Model View Controller,Modelstate,问题 我有一个用户可以编辑的字段列表。提交模型时,我想检查这些项目是否有效。我不能使用数据符号,因为每个字段都有不同的验证过程,直到运行时我才知道。如果验证失败,我将使用ModelState.addmodeleror(string key,string error),其中key是要添加错误消息的html元素的名称。由于存在字段列表,Razor为html项目生成的名称类似于字段[0]。DisplayName。我的问题是,有没有一种方法或方法可以从视图模型中获取生成的html名称的键 尝试的解决方案

问题

我有一个用户可以编辑的字段列表。提交模型时,我想检查这些项目是否有效。我不能使用数据符号,因为每个字段都有不同的验证过程,直到运行时我才知道。如果验证失败,我将使用
ModelState.addmodeleror(string key,string error)
,其中key是要添加错误消息的html元素的名称。由于存在字段列表,Razor为html项目生成的名称类似于
字段[0]。DisplayName
。我的问题是,有没有一种方法或方法可以从视图模型中获取生成的html名称的键

尝试的解决方案

我尝试了钥匙的
toString()
方法,但没有成功。我还查看了
HtmlHelper
类,但没有看到任何有用的方法

代码片段

查看模型

public class CreateFieldsModel
{
    public TemplateCreateFieldsModel()
    {
        FreeFields = new List<FieldModel>();
    }

    [HiddenInput(DisplayValue=false)]
    public int ID { get; set; }

    public IList<TemplateFieldModel> FreeFields { get; set; }


    public class TemplateFieldModel
    {
        [Display(Name="Dispay Name")]
        public string DisplayName { get; set; }

        [Required]
        [Display(Name="Field")]
        public int FieldTypeID { get; set; }
    }
}
您必须根据在表单中呈现字段的方式,在控制器中框显键(输入元素的名称)

例如,如果对
CreateFieldsModel
FreeFields
集合中的第二项验证失败,则可以将输入元素的名称框显为
FreeFields[1]。DisplayName
,其中将映射验证错误


据我所知,你不能轻易地从控制器那里得到它。

在深入研究源代码后,我找到了解决方案。有一个名为
ExpressionHelper
的类,用于在调用
EditorFor()
时为字段生成html名称。
ExpressionHelper
类有一个名为
GetExpressionText()
的方法,该方法返回一个字符串,该字符串是html元素的名称。下面是如何使用它

for (int i = 0; i < model.FreeFields.Count(); i++)
{
    //Generate the expression for the item
    Expression<Func<CreateFieldsModel, string>> expression = x => x.FreeFields[i].Value;
    //Get the name of our html input item
    string key = ExpressionHelper.GetExpressionText(expression);
    //Add an error message to that item
    ModelState.AddModelError(key, "Error!");
}

if (!ModelState.IsValid)
{
    return View(model);
}
for(int i=0;ix.FreeFields[i]。值;
//获取html输入项的名称
string key=ExpressionHelper.GetExpressionText(表达式);
//向该项添加错误消息
AddModelError(键“Error!”);
}
如果(!ModelState.IsValid)
{
返回视图(模型);
}

因此,可能有一个隐藏字段,其中名称是某个常量值,该字段的值是EditorFor方法的输出,但获取name属性除外?这很好,但我刚刚找到另一篇文章,将此逻辑封装在一个很好的扩展方法中:
for (int i = 0; i < model.FreeFields.Count(); i++)
{
    //Generate the expression for the item
    Expression<Func<CreateFieldsModel, string>> expression = x => x.FreeFields[i].Value;
    //Get the name of our html input item
    string key = ExpressionHelper.GetExpressionText(expression);
    //Add an error message to that item
    ModelState.AddModelError(key, "Error!");
}

if (!ModelState.IsValid)
{
    return View(model);
}