2011-03-01 12 views
291

Uygulamamda 2 ayrı Düzen olmasını istiyorum. Biri web sitesinin Genel bölümü için, diğeri Üye tarafı için olsun.ASP.NET MVC 3 tıraş bıçağı ViewStart dosyasında farklı Düzenleri nasıl belirtebilirim?

Basitlik için, tezlerin her biri için tüm mantığın düzgün bir şekilde 2 farklı denetleyiciye sarıldığını varsayalım.

  • PublicController
  • StaffController

Ve onların her birinin altında tüm View için karşılık gelen Düzeni var.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml ben "Kamu" altındaki tüm görünümün/Aksiyon "Personeli" altında PublicLayout ve her şeyi kullanmak belirtmek için _ViewStart.cshtml dosyasını nasıl kullanırım

StaffLayout'u kullan?

Teşekkürler! Benzetme

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

Birlikte /Views/Staff klasörün içinde başka _ViewStart.cshtml dosyayı bırakabilir:

+4

Sadece durumda. Eğer verilen 'Razor' görünüm için düzen kaldırmak istediğiniz, sadece set' Düzen = null;. ' –

+3

sizin örneğe bir yorum, muhtemelen olmamalıdır gibi kontrolörleri Kamu ve Personel kontrolörler en sık giriş noktası olarak uygulanmaktadır adında EventController, UserController veya benzeri gibi belirli anahtar iş varlıklarında CRUD benzeri eylemlere. Büyük bir ihtimalle, bir Kamu/Personel denetçisinin sorumluluğu geniş olacaktır. Bunun yerine alanları düşünün. http://msdn.microsoft.com/en-us/library/ee671793%28VS.100%29.aspx Sen bunun farkında olabilir ama başka bu okuma birisi yani sadece kayıt için, yanlış düşünebilir. – Alex

cevap

516

Sen /Views klasöründe varsayılan bir geçersiz ve istenen düzeni belirtmek istiyorum /Views/Public klasörünün içindeki bir _ViewStart.cshtml dosyayı koyabilirsiniz :

@{ 
    Layout = "~/Views/Shared/_StaffLayout.cshtml"; 
} 
bir denetçi eylemine içinde bir görünüm iade ederken de kullanılması gerektiğini düzen belirtebilirsiniz

ama bu eylem başına açıklanmıştır:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel); 
Yine bir başka ihtimal düzenini geçersiz kılar özel bir eylem filtredir. Bunu başarmak için birçok olasılık görebileceğiniz gibi. Senaryonuza en uygun olanı seçmek için size kalmış.


GÜNCELLEME:

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; 
     } 
    } 
} 

ve daha sonra bir kontrolör veya bununla bir eylem süslemek:

burada yorum bölümünde istediği gibi

bir ana sayfasını seçsin bir eylem filtrenin bir örnek düzen belirterek özel özellik istediğiniz:

[LayoutInjecter("_PublicLayout")] 
public ActionResult Index() 
{ 
    return View(); 
} 
+0

@Justin, ben de ... Ben 'LayoutInjecterAttribute' yaratacak –

+1

@DarinDimitrov önümüzdeki Örnek :-) cevabım bu belirtti. ? Belirli bir yer var mı? – kbvishnu

+2

@VeeKeyBee, bir 'ActionFilters' alt klasörünün içindeki koyabilirsiniz. –

14

Bu yöntem yeni başlayanlar için ASP.NET MVC uygulamanızda Layouts oluşturma işlemini kontrol etmenin en kolay yoludur. Denetleyiciyi tanımlayabilir ve Layouts'u par denetleyici olarak oluşturabiliriz. Bunu yapmak için, Kodumuzun Views klasörünün kök dizinindeki _ViewStart dosyasında yazabiliriz. Aşağıda bir örnek nasıl yapılabileceğini göstermektedir.

@{ 
      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; 
     } 

Komple Madde here oku "Nasıl ASP farklı Düzeni Render için.

27

Bir daha metot Görünüm içindeki Düzeni tanımlama etmektir NET MVC": yapmak

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

Daha Ways, here bulunabilir, bu yardımcı olur birisi

+1

Bu işe yaramaz - Ayrı _ViewStart.cshtml olmadan, görünümü yine de diğer düzeninde @RenderBody() yöntemi içinde verecek. – Tillman32

+0

Bu! Herkesin, yapmanız gereken tek şey bu kadar karmaşık süreçleri neden ortaya koymasıdır? –