2011-02-12 13 views
7

He utilizado un patrón de modelos de vista compuesta para algunos de los formularios de este proyecto. Funciona muy bien.Vista compuesta Objeto del modelo que causa un error de validación remota

En este caso tengo un modelo de vista VendorAddress. Utilizo Address (es) en algunos lugares en este proyecto, así que hice y Address view model object que puedo volver a usar. Luego decidí que quería hacer una comprobación minuciosa de los códigos de estado y las cremalleras, por lo que deseé intentar usar la validación remota y verificar el estado y el código postal de un conjunto almacenado de tablas en la base de datos.

El problema es que no recupero los valores de los métodos de acción remota para los campos que estoy solicitando (en este caso, estado y código postal). Creo que esto se debe al nombre que mangleing que el marco MVC hace para compuestos o subtipos para id (s) para las entradas en este caso está haciendo nombres como 'Address_Line1' y 'Address_State' y 'Address_PostalCode'.

En última instancia, la pregunta que tengo es, ¿hay alguna manera de desactivar la 'Dirección_' pre-rellenada desde el objeto de modelo de vista base de manera que MVC framework pueda ponerlo en el objeto después de la publicación del formulario ?

public class AddressViewModel 
{ 
    [ScaffoldColumn(false)] 
    public int AddressId { get; set; } 
    [Required(ErrorMessage = "Please enter the first address line")] 
    public string Line1 { get; set; } 
    public string Line2 { get; set; } 
    public string Line3 { get; set; } 
    [Required(ErrorMessage = "Please enter a city name")] 
    public string City { get; set; } 
    [Required(ErrorMessage = "Please enter a state 2 letter code")] 
    [StringLength(2)] 
    [Remote("CheckState", "Validation", AdditionalFields = "PostalCode")] 
    public string State { get; set; } 
    [Required(ErrorMessage = "Please enter a postal code")] 
    [Remote("CheckZip", "Validation", AdditionalFields = "State")] 
    [Display(Name = "Zip/Postal Code")] 
    public string PostalCode { get; set; } 
    public string Country { get; set; } 
} 

public class VendorContactViewModel 
{ 
    public int VedorContactId { get; set; } 
    public int ContactVendorId { get; set; } 
    public int ContactId { get; set; } 
    [Required] 
    [Display(Name = "Contact Type")] 
    public byte ContactTypeId { get; set; } 
    public string ContactType { get; set; } 
    [Required] 
    [Display(Name = "Contact Info")] 
    public string ContactInfo { get; set; } 
    [Display(Name = "Contact Label")] 
    public string ContactLabel { get; set; } 
    public IEnumerable<SelectListItem> ContactTypes { get; set; } 
} 

entonces en forma después de la prestación que tiene este aspecto:

<input type="text" value="" size="2" name="Address.State" maxlength="2" id="Address_State" 
    data-val-required="Please enter a state 2 letter code" data-val-remote-url="/Validation/CheckState" 
    data-val-remote-additionalfields="*.State,*.PostalCode" data-val-remote="&amp;#39;State&amp;#39; is invalid." 
    data-val-length-max="2" data-val-length="The field State must be a string with a maximum length of 2." 
    data-val="true" class="input-validation-error"> 

me sale la llamada remota, pero no hay nada en los parámetros de "Estado" y "PostalCode", por lo que las rutinas discretas son disparando, pero creo que no sabe dónde buscar los datos, aunque escribí algo en los campos propicios. Como se puede ver en el código dictada el id = "Address_State" y el-val-remote-additionalfields de datos = ".State, .PostalCode"

Gracias por su tiempo y esfuerzo,

Irv

Respuesta

10

intente especificar un prefijo para ayudar al aglutinante modelo se unen correctamente los valores de petición Address.PostalCode y Address.State a sus parámetros de acción correspondientes:

public ActionResult CheckState(
    [Bind(Prefix = "Address.State")]string State, 
    [Bind(Prefix = "Address.PostalCode")]string PostalCode 
) 
{ 
    ... 
} 
+6

Gracias Darin, lo he descubierto pero esta es básicamente la respuesta correcta. Aunque realmente necesitas la propiedad en el enlace también, como [Enlazar (Prefijo = "Dirección.Estado")] cadena Estado ..... –

+0

Gracias Darin ... Eres increíble ... :) –

0

me encontré con t su problema, pero necesitaba usar el mismo ViewModel en múltiples vistas con diferentes prefijos. Terminé escribiendo javascript que modificó las reglas de validación remota de jQuery para que no incluyeran ningún prefijo:

$('[data-val-remote]').each(function() { 
    // overwrite the remote rule data so that it sends non-prefixed property name to the server 
    var remoteRule = $(this).rules().remote; 
    var newData = {}; 
    var keys = Object.keys(remoteRule.data); 
    for (var i = 0; i < keys.length; i++) { 
     var nonPrefixedPropertyName = $(keys[i].split('.')).last()[0]; 
     newData[nonPrefixedPropertyName] = remoteRule.data[keys[i]]; 
    } 
    remoteRule.data = newData; 
}); 
Cuestiones relacionadas