C# GetFullHtmlFieldDid用于自定义要求自定义对象属性的验证程序

C# GetFullHtmlFieldDid用于自定义要求自定义对象属性的验证程序,c#,asp.net-mvc,validation,C#,Asp.net Mvc,Validation,我按照中所述创建Requiridif属性 我有这样的课程: public class MainClass { public string Title { get; set; } public SubClass Additional { get; set; } } public class SubClass { [RequiredIf("Field1NotExists", false, ErrorMessage = "field 1 is required")] p

我按照中所述创建Requiridif属性

我有这样的课程:

public class MainClass
{
    public string Title { get; set; }
    public SubClass Additional { get; set; }
}
public class SubClass
{
    [RequiredIf("Field1NotExists", false, ErrorMessage = "field 1 is required")]
    public string Field1 { get; set; }
    public bool Field1NotExists { get; set; }
}
在视图中,我使用EditorFor:

@EditorFor(m=>m.Additional.Field1) @EditorFor(m=>m.Additional.Field1NotExists)

不引人注目的客户端验证工作正常

但是当我使用TextBoxFor和CheckBoxFor时

@Html.TextBoxFor(m => m.Additional.Field1)
@Html.CheckBoxFor(m => m.Additional.Field1NotExists)
不引人注目的客户端验证不起作用

requiredif属性的一部分:

private string BuildDependentPropertyId(ModelMetadata metadata, ViewContext viewContext)
        {
            string depProp = viewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(this.DependentProperty);
            var thisField = metadata.PropertyName + "_";
            if (depProp.StartsWith(thisField))
                depProp = depProp.Substring(thisField.Length);
            else
            {
                var thisFieldInMiddle = "_" + metadata.PropertyName + "_";
                if (!this.DependentProperty.Contains(thisFieldInMiddle))
                    depProp = depProp.Replace(thisFieldInMiddle, "_");
            }
            return depProp;
        }
当我为ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldDid(this.DependentProperty)使用EditorFor ViewContext.ViewData.TemplateInfo时,返回完整id(附加的\u字段1\u字段1注释存在)

当我为ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldDid(this.DependentProperty)使用TextBoxforViewContext.ViewData.TemplateInfo时,只返回las字段名(Field1NotExists而不是附加的_Field1NotExists)

为什么ViewContext在这两方面不同?当我使用TextBoxFor时,如何获得完整的字段id


很抱歉,英语不好

TextBoxFor
和其他输入扩展不保留前缀,只有编辑器和显示扩展才保留前缀。如果您检查
TemplateInfo.HtmlFieldPrefix
,您将看到它是空的

您还将发现,如果将TextBoxFor用于复杂的ViewModels,则由于这个原因,在提交时无法正确绑定数据。使用编辑器模板的另一个原因