2015-07-29 28 views
5

toBeRemoteChecked numaralı bir üye ve valueToMap numaralı bir modeliyle bir ModelA modelim var. Ne zaman bir ModelA örneğini oluşturursam, MapToA örneğine de ihtiyacım var, bu yüzden modelA üyesi ve valueToMap üyesi olan CreateModelA modelim var. Form sunulduğunda, modelA veritabanı tablosuna ModelA ekleyin ve modelA ve valueToMap kimliklerinden oluşan MapToA için bir örnek oluşturun ve ekleyin. Ben ModelA bir örneğini düzenlediğinizde kod AçısındanUzaktan Doğrulama ile ASP.NET MVC Bağlama

public class ModelA 
{ 
    [Key] 
    public int ID { get; set; } 
    [Required, Remote("isValid", "MyController", ErrorMessage = "not valid")] 
    public string toBeRemoteChecked { get; set; } 
} 

public class MapToA 
{ 
    [Key] 
    public int Map_ID { get; set; } 
    [Required] 
    public int modelAID { get; set; } 
    [Required] 
    public int valueToMap { get; set; } 
} 

public class CreateModelA 
{ 
    public ModelA modelA { get; set; }; 
    public int valueToMap { get; set; }; 
} 

, MapToA değerler önemli değil (ve çoğu durumda birden fazla aynı modelA kimlikli mapToA örneği var), ama uzaktan doğrulama ait toBeRemoteChecked önemli kalır.

Benim Sorun: doğrulama yöntemi için bağlayıcı: Ben olduğu gibi, bir ModelA düzenlerken o çalışıyor, ama ModelACreateModelA aracılığıyla (Hep yaratıyorum değilken bırakırsanız

public ActionResult isValid(string toBeRemoteChecked) { ... } 

toBeRemoteChecked numaralı telefon numarasından null değerini al. Ben BindPrefix

public ActionResult isValid([Bind(Prefix = "modelA.toBeRemoteChecked")] string toBeRemoteChecked) { ... } 

kullandığınızda ben ModelA oluştururken çalışıp çalışmadığını, ancak bunu düzenlerken ediyorum değilken. Ben (yerine HTML yardımcı yarattığı oluyor modelA.toBeRemoteChecked ait) @Html.TextBoxFor ait htmlAttributes bir ... @Name = "toBeRemoteChecked" ... ekleyerek Create.cshtml içinde "ad" değiştirmeye çalıştığınızda

ardından doğrulama çalışıyor, ancak bağlanmasının Tablonun değeri kaybolur ve değerler veritabanına (null değeri) kaydedildiğinde hatayı alırım.

Oluşturma ve düzenleme için farklı bağlama nasıl yapılır?

Şimdiye kadar, benim geçici çözüm ModelA ve CreateModelA: IValidatableObject yapmak ve benim public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) yönteminde elemanı toBeRemoteChecked kontrol etmektir. Ancak bu, hata iletilerini formun üstünde ve TextFor kutusunun yerine görüntülemez.

Peki: en iyi çözüm: her iki durumda da uzaktan doğrulama işleminin nasıl yapılacağı nasıl yapılır?

iyi ikinci: ait olduğu yere nesnenin yakınında IValidatableObject hata iletileri görüntüler (ve gönderdikten sonra, sağ eline hata iletileri almak)

Farklı fikirlere veya çözümlerin nasıl: karşılama.

Teşekkürler.

cevap

1

Bağlama sorunumu kodumdaki küçük bir değişiklikle çözen bir kalıtım (ve görünüm modelleri olmayan) içeren bir çözüm buldum. Uzaktan doğrulama için bağlayıcı iki yolu var

, ya sadece uzaktan

public ActionResult isValid(string toBeRemoteChecked) { ... } 

kontrol edilmelidir üyesini geçebilir veya bu üyenin sınıfının örneğini geçebilir. İkinci varyant İçinde
public ActionResult isValid(ModelA modelA) { ... } 

, tabii ki, sen modelA.toBeRemoteChecked ile toBeRemoteChecked değiştirmek zorunda. Bu ikinci sürümde, bağlama her iki durumda da çalışır - düzenleme yaparken ve ayrıca yukarıdaki bağlamda ModelA örneğini oluştururken. Bağlama işlemini yapmak için, uzaktan doğrulama yönteminin parametre adının, benim durumumdaki CreateModelA, yani modelA'daki üye adıyla eşleşmesi çok önemlidir.

Eğer çok karmaşık modele sahip durumda

, sadece bağlama/kapsar yani benim durumumda ben Varsayılan olarak

public ActionResult isValid([Bind(Include = "toBeRemoteChecked")] ModelA modelA) { ... } 

kullanmayı tercih ediyorum Eğer kullanarak kullanmak istediğiniz üyeleri ile parametreyi modelA başlatabilir (Dahil Olmadan), diğer tüm üyeler boş kalacak veya varsayılan bir değere sahip olacaktır - bu nedenle, yalnızca doğrulama için başka üyelere ihtiyacınız varsa Dahil et'i kullanmanız gerekir - benim durumumda, Dahil Et'i kaldırırken de aynı olurdum)

3

this question'a benzer ve ilginç bir sorun, bunun sonucunda Codeplex'te bir sorun bildirdim, ancak henüz çözülmedi. Bağlantı, bu sorunu çözecek jquery.validate.js dosyasına önerilen bir değişiklik içerir (önek dizisini çıkarır), ancak bu, komut dosyasını güncelleştirdiğinizde, gerçekten de istenmedikçe, bunu korumanız gerektiği anlamına gelir.Eğer bir önek asla böylece

Seçeneklerden biri ModelA devralan ve sadece int valueToMap özellik eklemek için CreateModelA değiştirmektir - senin yerine her zaman aynı @Html.TextBoxFor(m => m.modelA.toBeRemoteChecked)

ait @Html.TextBoxFor(m => m.toBeRemoteChecked) kullanılarak [Remote] istemci tarafı sadece doğrulama, hangi Gönderdiğinizde doğrulama işlemini sunucuda gerçekleştirmeniz gerektiği anlamına gelir. Yani sadece mülk için istemci tarafı doğrulama yok olduğunu kabul ve bunun yerine özellik için POST yöntemleri (ler) de bir ModelState hatayı ekleyip görünümü geri dönebilirler böylece onun ilişkili ValidationMessageFor() eleman görüntülenen

Yan not: Modelinizin bir [Key] özniteliğine sahip olması, bunun bir model değil, bir model olduğunu ve [Remote] bir görünüm özel özniteliği olduğunu öne sürer. Özellikle verileri düzenlerken görünüm modelleri kullanmalısınız. (bkz. What is ViewModel in MVC?)

+0

Teşekkürler. İstemci tarafında doğrulama için, devralma seçeneği denedim - aynı zamanda bir demo projesi çalıştı, ama ben db.ModelAset.Add (createModelA) 'Ben ya veritabanına otomatik olarak eklenen istenmeyen ek sütunlar ile sona ermek veya bir Bu sütunları veritabanından el ile sildikten sonra "geçersiz sütun adı" hatası. Gerekli tüm üyeleri 'createModelA'dan' modelA'ya kopyalayarak denetleyicideki 'modelA'yı el ile oluşturduğumda db.ModelAset.Add (modelA)' yapabilirim. Bunun için kısa bir yol var mı? (gerçek modelimin yaklaşık 20 üyesi var, bu yüzden mümkün, ama çok hoş değil). Teşekkürler. – outofmind

+0

Son paragrafımı tekrar okumanız gerekiyor :) Görünüm modelinin veritabanıyla ilişkisi yok. –

+0

Tamam.Bu nedenle, görünüm modelinden veri modeline veri taşırken ek çabalarım var, yardımınız için teşekkürler :-) – outofmind