我按照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?
抱歉英文不好
答案 0 :(得分:0)
TextBoxFor
和其他输入扩展程序不会保留前缀,只有编辑器和显示扩展程序才能执行。如果您检查TemplateInfo.HtmlFieldPrefix
,您会发现它已空。
您还会发现,如果您在复杂的ViewModel中使用TextBoxFor,那么当您提交此数据时,数据将无法正确绑定。使用编辑器模板的另一个原因。