Bagaimana cara menentukan Tata Letak berbeda dalam file ViewStart silet ASP.NET MVC 3?

313

Saya ingin memiliki 2 Tata Letak terpisah dalam aplikasi saya. Katakanlah satu untuk bagian Umum situs web dan yang lainnya untuk sisi Anggota.

Untuk kesederhanaan katakanlah semua logika untuk masing-masing situs tesis dibungkus rapi menjadi 2 pengontrol yang berbeda.

  • PublicController
  • StaffController

Dan mereka masing-masing memiliki Tata Letak yang sesuai untuk semua Tampilan di bawah masing-masing.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

Bagaimana cara menggunakan file _ViewStart.cshtml untuk menentukan bahwa semua Tampilan / Tindakan di bawah "Publik" menggunakan PublicLayout dan segala sesuatu di bawah "Staf" menggunakan StaffLayout?

Terima kasih!

Justin
sumber
4
Untuk jaga-jaga: jika Anda ingin menghapus tata letak untuk tampilan yang diberikan Razor, cukup aturLayout = null;
Leniel Maccaferri
3
Sama seperti komentar pada contoh Anda, Anda mungkin tidak boleh memiliki pengontrol bernama Publik dan Staf. Pengontrol paling sering diimplementasikan sebagai titik masuk ke tindakan seperti CRUD pada entitas bisnis utama tertentu, seperti EventController, UserController, atau sejenisnya. Jika aplikasi Anda cukup besar, tanggung jawab pengontrol Publik / Staf akan menjadi lebar. Pertimbangkan Area. msdn.microsoft.com/en-us/library/ee671793%28VS.100%29.aspx Anda mungkin menyadari hal ini, tetapi orang lain yang membaca ini mungkin mendapatkan ide yang salah, jadi hanya untuk catatan.
Alex

Jawaban:

558

Anda bisa meletakkan _ViewStart.cshtmlfile di dalam /Views/Publicfolder yang akan menimpa file default di /Viewsfolder dan menentukan tata letak yang diinginkan:

@{
    Layout = "~/Views/Shared/_PublicLayout.cshtml";
}

Secara analogi Anda bisa meletakkan _ViewStart.cshtmlfile lain di dalam /Views/Stafffolder dengan:

@{
    Layout = "~/Views/Shared/_StaffLayout.cshtml";
}

Anda juga bisa menentukan tata letak mana yang harus digunakan ketika mengembalikan tampilan di dalam aksi pengontrol tapi itu per tindakan:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

Namun kemungkinan lain adalah filter tindakan khusus yang akan menimpa tata letak. Seperti yang Anda lihat banyak kemungkinan untuk mencapai ini. Terserah Anda untuk memilih mana yang paling cocok dengan skenario Anda.


MEMPERBARUI:

Seperti yang diminta di bagian komentar, inilah contoh filter tindakan yang akan memilih halaman master:

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}

dan kemudian menghias pengontrol atau tindakan dengan atribut khusus ini menentukan tata letak yang Anda inginkan:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}
Darin Dimitrov
sumber
1
@DarinDimitrov Di mana saya akan membuat LayoutInjecterAttribute. ? Apakah ada lokasi tertentu?
kbvishnu
2
@ VeeKeyBee, Anda bisa memasukkannya ke dalam ActionFilterssub-folder.
Darin Dimitrov
Satu masalah potensial dengan LayoutInjecterAttribute: Ini dipanggil sebelum metode controller OnException. Jadi, jika pengontrol memberikan hasil tampilan selama penanganan pengecualian, tata letak tidak akan ditetapkan.
Jeff Sharp
Sebagai orang baru di MVC, saya ingin mengucapkan terima kasih karena mengajari saya banyak dalam jawaban ini. Namun saya tidak mengerti apa yang terjadi di dalam OnActionExecuted. Tolong perbarui jawaban untuk saya.
Imad
29

Satu metode lagi adalah Menentukan Layout di dalam View:

   @{
    Layout = "~/Views/Shared/_MyAdminLayout.cshtml";
    }

Lebih banyak cara untuk dilakukan, dapat ditemukan di sini , semoga ini membantu seseorang.

shaijut
sumber
1
Ini tidak akan berfungsi - tanpa _ViewStart.cshtml terpisah, tampilan Anda masih akan merender di dalam metode @RenderBody () di tata letak lainnya.
Tillman32
Ini! Mengapa semua orang mengedepankan proses yang sangat rumit ini ketika semua yang perlu Anda lakukan adalah ini!
George Harnwell
15

Metode ini adalah cara paling sederhana bagi pemula untuk mengontrol rendering Layout di aplikasi ASP.NET MVC Anda. Kita dapat mengidentifikasi controller dan merender Layouts sebagai par controller, untuk melakukan ini kita dapat menulis kode kita dalam file _ViewStart di direktori root dari folder Views. Berikut ini adalah contoh yang menunjukkan bagaimana hal itu dapat dilakukan.

@{
    var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
    string cLayout = "";

    if (controller == "Webmaster")
        cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
    else
        cLayout = "~/Views/Shared/_Layout.cshtml";

    Layout = cLayout;
}

Baca Artikel Lengkap di sini "Cara Merender Tata Letak yang berbeda di ASP.NET MVC"

Anil Sharma
sumber