problema Asp.Net MVC2 Clientside convalida con i controlli con prefissi
-
02-10-2019 - |
Domanda
Il problema è: quando ho messo 2 controlli dello stesso tipo su una pagina ho bisogno di specificare diversi prefissi per il legame. In questo caso le regole di convalida generate subito dopo la forma non sono corretti. Così come ottenere il lavoro di convalida del client per il caso:?
La pagina contiene:
<%
Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.PhonePhone, Prefix = "PhonePhone" });
Html.RenderPartial(ViewLocations.Shared.PhoneEditPartial, new PhoneViewModel { Phone = person.FaxPhone, Prefix = "FaxPhone" });
%>
il controllo ViewUserControl
<%= Html.TextBox(Model.GetPrefixed("CountryCode"), Model.Phone.CountryCode) %>
<%= Html.ValidationMessage("Phone.CountryCode", new { id = Model.GetPrefixed("CountryCode"), name = Model.GetPrefixed("CountryCode") })%>
dove Model.GetPrefixed("CountryCode")
restituisce solo "FaxPhone.CountryCode" o "PhonePhone.CountryCode" a seconda del prefisso
Ed ecco le regole di validazione generate dopo il modulo. Essi sono duplicati per il nome del campo "Phone.CountryCode". Mentre il risultato desiderato è 2 regole (richiesto, numero) per ciascuna delle FieldNames "FaxPhone.CountryCode", "PhonePhone.CountryCode" alt text http://www.freeimagehosting.net/uploads/37fbe720bf.png
La questione è un po 'duplicato di Asp.Net MVC2 Clientside convalida e di ID duplicato problema ma i consigli per generare manualmente gli ID non aiuta.
Soluzione
modo corretto di impostare gli stessi prefissi sia per testo e la validazione:
<% using (Html.BeginHtmlFieldPrefixScope(Model.Prefix)) { %>
<%= Html.TextBoxFor(m => m.Address.PostCode) %>
<%= Html.ValidationMessageFor(m => m.Address.PostCode) %>
<% } %>
dove
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;
}
}
}
(per caso trovato la soluzione nel codice sul blog di Steve Sanderson http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ )
Sembra anche Html.EditorFor approccio dovrebbe funzionare così come suggerito qui: ASP. NET MVC 2 - ViewModel Prefisso