2012-12-22 20 views
7

Özel Model Binding olmadan bunu halletmenin bir yolu var mı?Çocuk Arabirimi ile ASP.NET MVC 4 ViewModel

public class MyViewModel { 
    public string UserId { get; set; } 
    public IJob Job { get; set; } 
} 

public interface IJob { 
    public long Id { get; set; } 
    public string CompanyName { get; set; } 
} 

public class FullTimeJob : IJob { 
    // omitted for brevity 
} 

public class Internship : IJob { 
    // omitted for brevity 
} 

yaşadığım sorun o örneğini hangi IJob uygulanması anlamıyor çünkü varsayılan modeli ciltteki bir hata alıyorum olduğunu. MyViewModel'i yarattığımda, FullTimeJob örneğini Job özelliğine ayarladım. ASP.NET uygulama türünü koruyamaz sanırım?

Bunun için en iyi uygulama çözümü nedir?

cevap

1

Görünümler yalnızca UI ile denetleyici arasındaki veri taşıyıcılardır. Böylece görünümünüze sadece Id ve CompanyName özelliklerini ekleyebilirsiniz. Yapmak istediğin tek şey, kimlik almak ve UI'den şirket değerlerini almak. Kullanıcı arayüzünden veri alırken staj veya tam zamanlı bir iş olup olmaması önemli olmayabilir. Kullanıcı arayüzünden aldığınız verileri işlerken önemli olabilir, ancak bu, View'ın sorumluluğunda değildir.

+0

Nesne hiyerarşisini sürdürmek istiyorum, bu yüzden işten atılan alanları doğrudan görünüm modeline koymaktan kaçınmak istiyorum. Eğer bunu yapıyorumsa, ViewModel bana hiçbir şey satın almıyor. –

+0

Evet, bunu özel bir model bağlayıcıda yaptım, ama sadece daha az özel bir cevap olacağını umuyordum. –

+0

ViewModel jenerikinizi "MyViewModel sınıfında" T: IJob, new() 've yapıcıda özel İş Türü'nü başlatabilirsiniz" Job = new T(); 'ancak yine de somut İş türüne bağlıdır. –

0

Seçeneklerden biri, özellikle zarif olmasa da, aşağıdaki gibi olabilir:

public class MyViewModel { 
    public string UserId { get; set; } 
    public FulltimeJob FulltimeJob { get; set; } 
    public InternJob InternJob { get; set; } 

    public IJob Job { get { return FulltimeJob ?? InternJob; } } 
} 

herhangi sınıfa özel özelliklerine erişim korurken Bu, size Meslek özelliği aracılığıyla paylaşılan özelliklerine kolay erişim sağlar.

POST denetleyici yöntemlerinde hangi özelliğin bulunduğunu kontrol edebilir ve buna göre hareket edebilirsiniz.

+0

Bu, bir çözüm için iyi bir fikirdir ve ben orada bununla nereye gittiğinizi görüyorum, ancak konuya eklediğim zaman var IJob'un yeni bir uygulaması (zaten 6 tane var), bu sınıfı değiştirmek zorundayım. Eklediğiniz iki ek alanın bir harita veya koleksiyonda olması korkunç olmasa da, yine de biraz tıkanıklık hissettiriyor. –

+0

Katılıyorum; Sanırım bu sınıfların ne kadar benzer olduğu ve gerçekten onlar için görüntüleme ve denetleyici yöntemleri paylaşmanız gerekip gerekmediği ortaya çıkıyor. Bir başka (benzer de olsa) rota, görünüm modelini düzleştirmek ve denetleyicide hangi alanların doldurulması beklenebileceğini size bildirmek için bir JobType'ın yanı sıra sadece alanları (tüm iş sınıflarınızdaki tüm alanların birleşimini) içerir. Bunu kolaylaştırmak için özellik eşlemesini basitleştirmek/otomatikleştirmek için AutoMapper veya Fasterflect'i kullanın. –