2015-01-21 8 views
0

создать requridif атрибут, как описано в http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspxGetFullHtmlFieldId для пользовательских requiredif валидатор для пользовательского объекта недвижимости

У меня есть классы, как это:

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) возвращение только лас имя поля (Field1NotExists вместо Additional_Field1NotExists)

Почему ViewContext отличается в этих двух способов? И как я могу получить полный идентификатор поля, когда я использую TextBoxFor?

Извините за плохой английский

ответ

0

TextBoxFor и других расширений ввода не сохраняются префиксы, только редактор и отображение расширений делать. Если вы проверите TemplateInfo.HtmlFieldPrefix, вы увидите, что он пуст.

Вы также обнаружите, что если вы используете TextBoxFor со сложными ViewModels, данные не будут правильно связаны, когда вы отправляете по этой причине. Другая причина для использования шаблонов редактора.