Apa cara Anda mengirimkan data ke Halaman Master (menggunakan ASP.NET MVC) tanpa melanggar aturan MVC?
Secara pribadi, saya lebih suka kode pengontrol abstrak (pengontrol dasar) atau kelas dasar yang diteruskan ke semua tampilan.
Apa cara Anda mengirimkan data ke Halaman Master (menggunakan ASP.NET MVC) tanpa melanggar aturan MVC?
Secara pribadi, saya lebih suka kode pengontrol abstrak (pengontrol dasar) atau kelas dasar yang diteruskan ke semua tampilan.
Jawaban:
Jika Anda lebih suka tampilan Anda memiliki kelas data tampilan yang diketik dengan kuat, ini mungkin berhasil untuk Anda. Solusi lain mungkin lebih tepat tetapi ini adalah keseimbangan yang bagus antara desain dan kepraktisan IMHO.
Halaman master mengambil kelas data tampilan yang diketik dengan kuat yang hanya berisi informasi yang relevan dengannya:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Setiap tampilan yang menggunakan halaman master tersebut mengambil kelas data tampilan yang diketik dengan kuat yang berisi informasinya dan berasal dari data tampilan halaman master:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
Karena saya tidak ingin pengontrol individu mengetahui apa pun tentang mengumpulkan data halaman master, saya merangkum logika itu ke dalam pabrik yang diteruskan ke setiap pengontrol:
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);
}
}
Warisan cocok dengan master untuk melihat hubungan dengan baik, tetapi ketika harus membuat sebagian / kontrol pengguna saya akan menyusun data tampilan mereka ke dalam data tampilan halaman, misalnya
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
Ini hanya contoh kode dan tidak dimaksudkan untuk dikompilasi sebagaimana adanya. Dirancang untuk ASP.Net MVC 1.0.
Saya lebih suka memecah potongan data-driven dari tampilan master menjadi sebagian dan merendernya menggunakan Html.RenderAction . Ini memiliki beberapa keunggulan berbeda dibandingkan pendekatan pewarisan model tampilan populer:
EDIT
Generic Error telah memberikan jawaban yang lebih baik di bawah ini. Mohon dibaca!
Jawaban Asli
Microsoft sebenarnya telah memposting entri tentang cara "resmi" untuk menangani ini. Ini memberikan panduan langkah demi langkah dengan penjelasan tentang alasan mereka.
Singkatnya, mereka merekomendasikan menggunakan kelas pengontrol abstrak, tetapi buktikan sendiri.
Saya melakukan penelitian dan menemukan dua situs ini. Mungkin mereka bisa membantu.
ASP.NET MVC Tip # 31 - Meneruskan Data ke Halaman Master dan Kontrol Pengguna
Saya menemukan bahwa orang tua yang sama untuk semua objek model yang Anda berikan ke tampilan sangat berguna.
Akan selalu cenderung ada beberapa properti model umum antar halaman.
Objek Request.Params bisa berubah. Sangat mudah untuk menambahkan nilai skalar ke dalamnya sebagai bagian dari siklus pemrosesan permintaan. Dari perspektif tampilan, informasi itu bisa saja disediakan di QueryString atau FORM POST. hth
Saya berpendapat bahwa cara lain yang baik adalah membuat Antarmuka untuk tampilan dengan beberapa Properti seperti ParentView dari beberapa antarmuka, sehingga Anda dapat menggunakannya baik untuk kontrol yang memerlukan referensi ke halaman (kontrol orang tua) dan untuk tampilan master yang harus diakses dari tampilan.
Solusi lainnya kurang elegan dan memakan waktu terlalu lama. Saya minta maaf karena melakukan hal yang sangat menyedihkan dan miskin ini hampir setahun kemudian:
<script runat="server" type="text/C#">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
MasterModel = SiteMasterViewData.Get(this.Context);
}
protected SiteMasterViewData MasterModel;
</script>
Jadi jelas saya memiliki metode statis Get () di SiteMasterViewData yang mengembalikan SiteMasterViewData.