GetFullHtmlFieldId用于自定义对象属性的自定义requireif验证器

时间:2015-01-21 21:26:06

标签: c# asp.net-mvc validation

我按照http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx

中的说明创建了requridif属性

我有这样的课程:

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:

@ Html.EditorFor(m => m.Additional.Field1) @ Html.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;
        }

当我使用EditorFor ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(this.DependentProperty)返回完整ID(Additional_Field1_Field1NotExists)

当我使用TExtBoxFor ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(this.DependentProperty)时,只返回las字段名称(Field1NotExists而不是Additional_Field1NotExists)

为什么ViewContext在这两种方式上有所不同?当我使用TextBoxFor时,如何获得完整的字段ID?

抱歉英文不好

1 个答案:

答案 0 :(得分:0)

TextBoxFor和其他输入扩展程序不会保留前缀,只有编辑器和显示扩展程序才能执行。如果您检查TemplateInfo.HtmlFieldPrefix,您会发现它已空。

您还会发现,如果您在复杂的ViewModel中使用TextBoxFor,那么当您提交此数据时,数据将无法正确绑定。使用编辑器模板的另一个原因。