2010-05-03 5 views
5

Проблема заключается в том, что когда я помещаю 2 элемента управления одного типа на страницу, мне нужно указать разные префиксы для привязки. В этом случае правила проверки, созданные сразу после формы, являются неправильными. Так как получить работу проверки клиента для случая ?:Asp.Net MVC2 Clientside Проблема проверки с элементами управления с префиксами

страница содержит:

<% 
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.PhonePhone, Prefix = "PhonePhone" }); 
    Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.FaxPhone, Prefix = "FaxPhone" }); 
%> 

управления ViewUserControl <PhoneViewModel>:

<%= Html.TextBox(Model.GetPrefixed("CountryCode"), Model.Phone.CountryCode) %> 
<%= Html.ValidationMessage("Phone.CountryCode", new { id = Model.GetPrefixed("CountryCode"), name = Model.GetPrefixed("CountryCode") })%> 

где Model.GetPrefixed("CountryCode") просто возвращает "FaxPhone.CountryCode" или «PhonePhone.CountryCode» в зависимости от префикса


И вот правила проверки, созданные после формы. Они дублируются для имени поля «Phone.CountryCode». В то время как желаемый результат 2 правила (обязательно, номер) для каждого из имен полей «FaxPhone.CountryCode», «PhonePhone.CountryCode» alt text http://www.freeimagehosting.net/uploads/37fbe720bf.png

вопрос несколько дубликат Asp.Net MVC2 Clientside Validation and duplicate ID's problem но советуют вручную генерировать идентификаторы Безразлично Это помогает.

ответ

10

Правильный способ установить одинаковые префиксы как для текстового поля и проверки:

<% using (Html.BeginHtmlFieldPrefixScope(Model.Prefix)) { %> 
    <%= Html.TextBoxFor(m => m.Address.PostCode) %> 
    <%= Html.ValidationMessageFor(m => m.Address.PostCode) %> 
<% } %> 

где

public static class HtmlPrefixScopeExtensions 
{ 
    public static IDisposable BeginHtmlFieldPrefixScope(this HtmlHelper html, string htmlFieldPrefix) 
    { 
     return new HtmlFieldPrefixScope(html.ViewData.TemplateInfo, htmlFieldPrefix); 
    } 

    private class HtmlFieldPrefixScope : IDisposable 
    { 
     private readonly TemplateInfo templateInfo; 
     private readonly string previousHtmlFieldPrefix; 

     public HtmlFieldPrefixScope(TemplateInfo templateInfo, string htmlFieldPrefix) 
     { 
      this.templateInfo = templateInfo; 

      previousHtmlFieldPrefix = templateInfo.HtmlFieldPrefix; 
      templateInfo.HtmlFieldPrefix = htmlFieldPrefix; 
     } 

     public void Dispose() 
     { 
      templateInfo.HtmlFieldPrefix = previousHtmlFieldPrefix; 
     } 
    } 
} 

(случайно нашел решение в коде на блоге Стива Сандерсон http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/)

Также выглядит как Html.EditorFor подход должен работать так же, как предлагается здесь: ASP.NET MVC 2 - ViewModel Prefix

+0

Nice. Этот ответ был очень полезен. Хотелось бы, чтобы я мог увеличить его еще пару раз. –

+0

Очень, очень полезно. Спасибо. – Luke

+0

Я знаю, что это старый ответ, но мне было интересно, предпочтительнее ли использовать этот метод в вашем представлении: ViewData.TemplateInfo.HtmlFieldPrefix = "myViewModel.MyCustomObjdect"; –