2010-08-17 3 views
1

J'ai créé un contrôle utilisateur d'adresses qui est la suivante:validation ne fonctionne pas lorsque deux instances de contrôle utilisateur existe sur la vue

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Address>" %> 

    <div class="span-4" style="text-align: right" title="<%: GetLocalResourceObject("Type") %>"> 
     <%: GetLocalResourceObject("Type")%> 
    </div> 
    <div class="span-6 last"> 
     <%: Html.RadioButtonFor(model => model.AddressType, RealProperty.Core.Domain.AddressType.Postal, new { id = ViewData["AddressPrefix"] + "AddressType" })%> 
    &nbsp; 
     <%: GetLocalResourceObject("PostalType")%> 
     <%: Html.RadioButtonFor(model => model.AddressType, RealProperty.Core.Domain.AddressType.Intersection, new { id = ViewData["AddressPrefix"] + "AddressType" })%> 
    &nbsp; 
     <%: GetLocalResourceObject("IntersectionType")%> 
    </div> 
    <div class="span-4" style="text-align: right" title="<%: GetLocalResourceObject("Country") %>"> 
     <%: GetLocalResourceObject("Country")%> 
    </div> 
    <div class="span-6 last"> 
    <%: Html.DropDownList(ViewData["AddressPrefix"] + "Country", new SelectList(RealProperty.Core.Service.CountryService.Countries, "Id", "Name"), "Please select Country", new { id = ViewData["AddressPrefix"] + "Country" })%> 
     <%: Html.ValidationMessage(ViewData["AddressPrefix"] + "Country")%> 
    </div> 
    <div class="span-4" style="text-align: right" title="<%: GetLocalResourceObject("Address1") %>"> 
     <%: GetLocalResourceObject("Address1")%> 
    </div> 

. 
. 
. 
. 

Je vais utiliser deux instances de ce contrôle utilisateur sur une page pour "Adresse principale" et "Adresse alternative":

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<PhysicalLocation>" %> 

    <div class="span-12"> 
     <fieldset> 
      <legend>Main Address</legend> 
      <% 
       Html.RenderPartial("~/Views/Address/New.ascx", Model.MainAddress); 
      %> 
     </fieldset> 
    </div> 
    <div class="span-12 last"> 
     <fieldset> 
      <legend>Alternate Address</legend> 
      <% 
       Html.RenderPartial("~/Views/Address/New.ascx", Model.AlternateAddress); 
      %> 
     </fieldset> 
    </div> 

Le contrôle d'utilisateur d'adresse est lié au modèle "Adresse".

[PostalCode("PostalCode", "Country", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "PostalCode_Is_Invalid"), DisplayName("Address") ] 
    public class Address : ICanBeValidated 
    { 

     public virtual long Id { get; set; } 

     [RegularExpression("^[^,'\"]*$", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "InvalidCharacter"), 
    Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Field_Required"), StringLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Field_Max_Length_Allowed")] 
     public virtual string Address1 { get; set; } 

     [RegularExpression("^[^,'\"]*$", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "InvalidCharacter"), 
    StringLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Field_Max_Length_Allowed")] 
     public virtual string Address2 { get; set; } 

     [RegularExpression("^([a-zA-Z\\.\\-\\s]*)$", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "ValidCharacter_Allowed")] 
     [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Field_Required"), StringLength(30, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "Field_Max_Length_Allowed")] 
     public virtual string City { get; set; } 
    . 
    . 
    . 
} 

Je pense à rendre, il crée deux ensembles differnet de commandes d'entrée pour MainAddress et AlternateAddress (à savoir en provenance de l'expérience de formulaire Web).

Je devine que je manque un point très basique ici, car lorsque les commandes de l'utilisateur sont rendus, sur la page que j'ai deux « ville », « address1 », « adresse2 », etc.

Par conséquent, Microsoft Validation ne fonctionne que pour l'un des contrôles utilisateur. Le tableau JSON qui est envoyé au client contient uniquement la validation de celui-ci, en fonction de la définition du modèle. Par exemple, pour la propriété "City" de l'adresse, nous n'avons qu'une seule entrée dans le tableau mentionné et, par conséquent, seul l'élément "span" avec l'identifiant "City_ValidateMessage" associé à la validation existe.

J'apprécie toutes les pensées.

Merci, Mohammad

Répondre

0

La solution que je trouve sur Steve Sanderson's blog est un hack sur HttpContext pour générer des identifiants uniques lors du rendu du contrôle utilisateur. Il résout bien le problème avec la validation.

0

Si vous utilisez 2 cas sur la page, votre modèle a 2 ensembles de propriétés pour stocker l'adresse?

Votre modèle doit être:

Class DoubleAddressViewModel() 
    <PropertiesForAddressMain> 
    <PropertiesForAddressAlternate> 
End Class 

De vos commentaires ci-dessus, je suppose que vous avez un modèle qui représente une seule adresse

+0

Merci pour la réponse. J'ai une liste d'adresses; IList

Adresses. Adresses [0] est Principal, Adresses [1] est Alternative. Je peux aller votre chemin d'avoir seulement deux propriétés dans le modèle, mais il devrait fonctionner avec la liste aussi bien? – Mohammad

+0

Je n'ai pas suffisamment exploré le classeur de propriétés pour répondre à cette question, mais il semble que .Net aurait du mal à déterminer le nombre d'entrées à attendre lors de la reliure des données de poste au modèle. Cela dit, comme je ne l'ai pas essayé, je ne peux pas dire d'une façon ou l'autre – Basic

+0

J'ai mis à jour le modèle avec la solution fournie, mais je ne comprends toujours pas ce qui me manque ici. – Mohammad

Questions connexes