2013-06-17 13 views
6

,Veri Ek Açıklamalarını MVC'de Görünüm Modelinin alt özelliklerine uygulama? özelliklerine basit Veri Ek Açıklamalar koyarak

public class UnicornViewModel 
{ 
    [Required] 
    public string Name { get; set; } 

büyük Ama böyle bir şey var dedin sağlar:

public class SuperPower 
{ 
    public class Name { get; set; } 
} 

public class UnicornViewModel 
{ 
    [Required] 
    public string Name { get; set; } 

    public SuperPower PrimarySuperPower { get; set; } 

    public SuperPower SecondarySuperPower { get; set; } 

bırakmak ederken PrimarySuperPower.Name üzerinde Gerekli niteliği uygular nasıl SecondarySuperPower.Name için isteğe bağlı? Tercihen 1. istemci tarafında doğrulamaya ve 2. herhangi bir özel işlemden çıkıp Eylem/Özel doğrulayıcıda PrimarySuperPower.Name değerini kontrol etmek ve boşsa bir ModelState hatası eklemek gibi özel bir yöntemle. Genellikle bu desteklenmiyor

[Required(p => p.Name)] 
    public SuperPower PrimarySuperPower { get; set; } 

    public SuperPower SecondarySuperPower { get; set; } 
+0

Nitelik ne eklendiğini nereden öğrenecek? Özellikler sadece meta verilerdir. – Romoku

cevap

1

: gibi bir şey olsa daha iyi olurdu ASP.NET MVC3 Validation of nested view model object fields

Ama özel model doğrulama uygulamak, ancak her iki istemci ve sunucu tarafı için bunu yaparken oldukça karmaşık alır yapabilirsiniz. mütevazi doğrulama TextBoxFor ait htmlAttributes parametresine niteliklerini sadece geçmiş

[RequiredSubProperty("Name")] 
    public SuperPower PrimarySuperPower { get; set; } 

Ve şablonunda: Eğer SuperPower nesne için kendi şablon varsa

, kendi yapımı bir öznitelik için görünebilir ya da kullandığınız giriş yardımcısı.

Şablon kullanmıyorsanız, tüm bunları unutup yalnızca, adsız görüntü doğrulama özniteliklerini ilk ad görüntülenirken htmlAttributes parametresine geçiririm, ancak ikincisini değil. UnicornViewModel Her şey daha karmaşık yaklaşımlardan alabilirsiniz ne kadar yeniden bağlıdır

public class UnicornViewModel 
{ 
    [Required] 
    public string Name { get; set; } 

    [Required] 
    public string PrimarySuperPowerName { get; set; } 

    public string SecondarySuperPowerName { get; set; } 

gibi dümdüz edilmesi için

başka seçenektir. Tempolatı çok kullanmaya çalıştığımda, farklı bağlamlarda şablonlarla ilgili bazı şeylerin anlam ifade etmediğini ve bir nesne şablonunda çok fazla varyasyona ihtiyacım olduğunu fark ettim (bir alt şablonun bir ebeveyn sayfasında görüntülendiğinde Çocuğun ebeveynin ayrıntısına bağlandığı bir URL'nin olması mantıklı değildir, zaten bu sayfada olduğunuzdan, ancak çocuk şablonunun kullanıldığı her yerde, bu bağlantıyı ebeveyn ile göstermelidir). Sonunda, şablonlar kullanmayı bıraktım ve zaman zaman yeniden kullanım için iyi bir durumun olduğu kısmi bölümleri kullanıyorum. UI, kauçuğun yolla buluştuğu yerdir ve ViewModels, varlık/iş modelleriniz kadar iyi yapılandırılmayacaktır.

0

Bunu standart veri özellikleriyle yapamazsınız. Sözü ettiğin sözdizimi, lambda'yı kullanmaya çalıştığınız nesneye referans olmadığı için, özel bir uygulamada mümkün olmazdı.

FluentValidation gibi bir üçüncü taraf doğrulama kitaplığı kullanmaktan daha iyi olabilirsiniz. Doğrulama gereksinimleriniz için önemli ölçüde esneklik sağlar.

0

Kişisel olarak, ViewModels'i yönetmek için ModelMetadataClass'ı kullanma hayranıyım. Eğer fazladan adım gitmek ve kullanımı istekli iseniz AutoMapper aşağıdaki gibi bir ViewModel oluşturabilirsiniz:

public class SuperPower 
{ 
    public string Name { get; set; } 
} 

[MetadataType(typeof(UnicornViewModel.UnicornViewModelMetaData))] 
public class UnicornViewModel 
{ 
    public string Name { get; set; } 

    public RequiredSuperPowerViewModel PrimarySuperPower { get; set; } 

    public SuperPower SecondarySuperPower { get; set; } 

    public class UnicornViewModelMetaData 
    { 
     [Required] 
     public string Name { get; set; } 

    } 
} 

[MetadataType(typeof(UnicornViewModel.UnicornViewModelMetaData))] 
public class RequiredSuperPowerViewModel : SuperPower 
{ 
    public class RequiredSuperPowerModelMetaData 
    { 
     [Required] 
     public string Name { get; set; } 

    } 
} 

Bu modelinizi etkilemeden belirli bir modeli sınıfı için gerekli edilmesini istediğiniz hangi alanların almaya izin verecektir.

SuperPower reqSuperPower = AutoMapper.Mapper.Map<RequiredSuperPowerViewModel, SuperPower>(Data.PrimarySuperPower); 
0

Bu geç bir cevap olabilir, ama aynı şey ararken ben bu soruyu bulundu:

aşağıdaki gibi özgün süper güç rehydrate AutoMapper kullanıyorsanız. Bunu vardı önce

: Bu benim özellikle durum çözüldü nasıl

public class ProductVm 
{ 
    //some other properties   

    [DisplayName("Product Category", e => e.Description)] 
    public Category Category {get; set;} 
    [DisplayName("Parent Category", e => e.Description)] 
    public Category ParentCategory {get; set;} 
} 

giremedim: Ben gibilerle bir şey olmasını istedik hangi için

public class ProductVm 
{ 
    //+ some other properties   

    public Category Category {get; set;} 
    public Category ParentCategory {get; set;} 
} 

Bu her ikisi de aynı nesne sınıfı olduğundan, modelin kendisi.

public class ProductVm 
{ 
    //some other properties   

    public Category Category {get; set;} 
    public Category ParentCategory {get; set;} 

    [DisplayName("Product Category")] 
    public string Category => Category.Description; 

    [DisplayName("Main Category")] 
    public string ParentCategory => ParentCategory.Description; 
} 

Mümkün sadece biraz daha Kalan özel destek tutmak için yazabilirsiniz:

I (Ben sadece bu durumda Açıklaması değerini okumak ve yazmak değil gerekiyordu beri) şöyle çözüldü Alanlar ve Kategori nesnelerin özellik kapsülleme kaldırmak, ancak benim durumumda hala diğer kullanımlar için halka açık olması gerekiyordu.

aşağıdaki yapacağını yukarıdaki soruyu Dair:

public class UnicornViewModel 
{ 
    [Required] 
    public string Name { get; set; } 

    public SuperPower PrimarySuperPower { get; set; } 

    public SuperPower SecondarySuperPower { get; set; } 

    [Required] 
    public string PrimarySuperPowerName 
    { 
     get { return PrimarySuperPower.Name; } 
     set { PrimarySuperPower.Name = value; } 
    } 

    public string SecondarySuperPowerName 
    { 
     get { return SecondarySuperPower.Name; } 
     set { SecondarySuperPower.Name = value; } 
    } 
} 

Sonra SuperPower özelliklerini dize özelliklerine benim Görünüm bağlamak ve dışlamak istiyorum.

İlgili konular