MVC kurallarını ihlal etmeden verileri Ana Sayfaya (ASP.NET MVC kullanarak) geçirme yönteminiz nedir?
Kişisel olarak, tüm görünümlere aktarılan soyut denetleyiciyi (temel denetleyici) veya temel sınıfı kodlamayı tercih ederim.
MVC kurallarını ihlal etmeden verileri Ana Sayfaya (ASP.NET MVC kullanarak) geçirme yönteminiz nedir?
Kişisel olarak, tüm görünümlere aktarılan soyut denetleyiciyi (temel denetleyici) veya temel sınıfı kodlamayı tercih ederim.
Yanıtlar:
Görünümlerinizin güçlü bir şekilde yazılmış görünüm veri sınıflarına sahip olmasını tercih ediyorsanız, bu sizin için uygun olabilir. Diğer çözümler muhtemelen daha doğrudur ancak bu, tasarım ve pratiklik IMHO arasında güzel bir denge.
Ana sayfa, yalnızca kendisiyle ilgili bilgileri içeren güçlü bir şekilde yazılmış bir görünüm veri sınıfını alır:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Bu ana sayfayı kullanan her görünüm, bilgilerini içeren ve ana sayfaların görünüm verilerinden türetilen güçlü bir şekilde yazılmış bir görünüm veri sınıfını alır:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
Tek tek denetleyicilerin ana sayfa verilerini bir araya getirme hakkında hiçbir şey bilmesini istemediğimden, bu mantığı her denetleyiciye aktarılan bir fabrikada kapsülledim:
public interface IViewDataFactory
{
T Create<T>()
where T : MasterViewData, new()
}
public class ProductController : Controller
{
public ProductController(IViewDataFactory viewDataFactory)
...
public ActionResult Index()
{
var viewData = viewDataFactory.Create<ProductViewData>();
viewData.Name = "My product";
viewData.Price = 9.95;
return View("Index", viewData);
}
}
Miras, ilişkiyi iyi görüntülemek için ana ile eşleşir, ancak söz konusu kısmi / kullanıcı kontrolleri oluşturma söz konusu olduğunda, görünüm verilerini sayfaların görüntüleme verilerine oluşturacağım, örneğin
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
Bu yalnızca örnek koddur ve olduğu gibi derlenmesi amaçlanmamıştır. ASP.Net MVC 1.0 için tasarlanmıştır.
Ana görünümün veriye dayalı parçalarını bölümlere ayırmayı ve Html.RenderAction kullanarak oluşturmayı tercih ediyorum . Bunun, popüler görünüm modeli miras yaklaşımına göre birkaç farklı avantajı vardır:
DÜZENLE
Genel Hata aşağıda daha iyi bir cevap sağlamıştır. Lütfen onu oku!
Orijinal Cevap
Microsoft, bunun üstesinden gelmek için "resmi" yol hakkında bir girdi yayınladı . Bu, akıl yürütmelerinin bir açıklamasıyla birlikte adım adım bir gözden geçirme sağlar.
Kısacası, soyut bir denetleyici sınıfı kullanmanızı önerirler, ancak kendiniz görün.
Biraz araştırma yaptım ve bu iki siteye rastladım. Belki yardım edebilirler.
ASP.NET MVC İpucu # 31 - Verileri Ana Sayfalara ve Kullanıcı Kontrollerine Aktarma
Görünüme ilettiğiniz tüm model nesneleri için ortak bir ebeveynin son derece yararlı olduğunu görüyorum.
Zaten sayfalar arasında her zaman bazı ortak model özellikleri olacaktır.
Request.Params nesnesi değiştirilebilir. İstek işleme döngüsünün bir parçası olarak buna skaler değerler eklemek oldukça kolaydır. Görünüm açısından bakıldığında, bu bilgi QueryString veya FORM POST'ta sağlanabilirdi. hth
Başka bir iyi yolun, bazı arayüzlerin ParentView gibi bazı Özellikli görünüm için Arayüz oluşturmak olabileceği konusunda, hem sayfaya referans gerektiren kontroller (ana kontrol) hem de erişilmesi gereken ana görünümler için kullanabilirsiniz. Görüntüleme.
Diğer çözümler zarafetten yoksundur ve çok uzun sürer. Bu çok üzücü ve fakir şeyi neredeyse bir yıl sonra yaptığım için özür dilerim:
<script runat="server" type="text/C#">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
MasterModel = SiteMasterViewData.Get(this.Context);
}
protected SiteMasterViewData MasterModel;
</script>
Açıkçası, SiteMasterViewData'yı döndüren SiteMasterViewData üzerinde bu statik Get () yöntemine sahibim.