2011-02-12 16 views
7

Bu projedeki bazı formlar için birleşik görünüm modelleri modelini kullandım. Çok iyi çalışıyor.Bileşik Görünüm Uzaktan doğrulama hatasına neden olan Model nesnesi

Bu durumda bir VendorAddress görünüm modelim var. Bu projede birkaç yerde adres (ler) kullanıyorum, böylece yeniden kullanabileceğim adres görünümü model nesnesini yaptım. Sonra ben devlet kodları ve fermuarlar çok kapsamlı bir kontrol yapmak istedim, bu yüzden uzak doğrulama kullanmaya çalışacağım ve veritabanında depolanmış bir tablo kümesini devlet ve posta kodu kontrol etmeyi denemek istedim.

Sorun şu ki, bu soruyu sorduğum alanlar için uzak eylem yöntemlerine geri döndürmüyorum (bu durumda State ve PostalCode). Bunun, MVC çerçevesinin, girdiler için kimlik (ler) için bileşik (ler) in bileşik veya alt türleri için yaptığı “manşet” adından kaynaklandığına inanıyorum çünkü 'Address_Line1' ve 'Address_State' ve 'Address_PostalCode' gibi isimler alıyor.

Nihayetinde, sahip olduğum soru, MVC çerçevesinin, formun gönderilmesinden sonra nesneyi içine koyabileceği şekilde, temel görünüm modeli nesnesinden önceden alınmış olan 'Address_' komutunu kapamanın bir yoludur. ? şeklinde ardından

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; } 
} 

render sonra şuna benzer:
<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"> 

ben uzaktan çağrı olsun ama "Devlet" parametrelerinde hiçbir şey ve "PostalCode" var, bu yüzden göze batmayan rutinleri vardır ateş ama ben mensioned alanlarda bir şey yazmış olsa bile veri için nereye bakmak gerektiğini bilmiyorum. Eğer işlenen kodunda id = "Address_State" ve veri-val-uzak-additionalfields = " .State, .PostalCode" zaman ve çaba için

sayesinde

Irv

görebileceğiniz gibi

cevap

10

modeli bağlayıcı doğru bunlara karşılık gelen eylem parametrelerine Address.PostalCode ve Address.State istek değerlerini bağlamak yardımcı bir önek belirtmeyi deneyin:

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

Teşekkür Darin, bu anladım ama var: Ben herhangi bir önek içermiyordu bu yüzden jQuery uzaktan doğrulama kurallarını modifiye javascript yazma sona erdi. Her ne kadar Bağlantıda da Mülkte gerçekten ihtiyacınız var, [Bind (Önek = "Address.State")] dize State… –

+0

Teşekkürler Darin .. Siz harikasınız .. :) –

0

ben t koştu onun sorunu, ancak aynı önizleme ile farklı görünümleri aynı ViewModel kullanmak gerekiyordu. Bu ikonların doğru cevap

$('[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; 
}); 
İlgili konular