ASP.NET MVC 3 tıraş makinesi ViewStart dosyasında farklı Düzenleri nasıl belirleyebilirim?


313

Uygulamamda 2 ayrı Layouts olmasını istiyorum. Diyelim ki biri web sitesinin Herkese Açık bölümü için, diğeri de Üye tarafı için.

Basitlik için, bu sitelerin her biri için tüm mantığın düzgün bir şekilde 2 ayrı kontrolöre sarıldığını varsayalım.

  • PublicController
  • StaffController

Ve her birinin her birinin altındaki tüm Görünüm için karşılık gelen bir Düzeni var.

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

_ViewStart.cshtml dosyasını, "Genel" altındaki tüm Görünümlerin / Eylemin PublicLayout'u ve "Personel" altındaki her şeyin StaffLayout'u kullanmasını belirtmek için nasıl kullanabilirim?

Teşekkürler!


4
Her ihtimale karşı: belirli bir Razorgörünüm için düzeni kaldırmak istiyorsanız , şunu ayarlayınLayout = null;
Leniel Maccaferri

3
Örneğinize bir yorum olarak, muhtemelen Genel ve Personel adlı denetleyicileriniz olmamalıdır. Denetleyiciler çoğunlukla EventController, UserController veya benzerleri gibi belli başlı iş varlıklarında CRUD benzeri eyleme giriş noktası olarak uygulanır. Başvurunuz makul derecede büyükse, bir Kamu / Personel denetleyicisinin sorumluluğu çok geniş olacaktır. Bunun yerine Alanları düşünün. msdn.microsoft.com/en-us/library/ee671793%28VS.100%29.aspx Bunun farkında olabilirsiniz, ancak bunu okuyan bir başkası yanlış bir fikir edinebilir, sadece kayıt için.
Alex

Yanıtlar:


558

Klasörün _ViewStart.cshtmliçine, /Views/Publicklasördeki varsayılan dosyayı geçersiz kılacak /Viewsve istenen düzeni belirleyecek bir dosya koyabilirsiniz :

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

Benzeşime göre _ViewStart.cshtml, /Views/Staffklasörün içine başka bir dosya koyabilirsiniz :

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

Bir denetleyici eylemi içindeki bir görünümü döndürürken hangi mizanpajın kullanılması gerektiğini de belirtebilirsiniz, ancak bu işlem başınadır:

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

Yine başka bir olasılık, düzeni geçersiz kılacak özel bir eylem filtresidir. Gördüğünüz gibi bunu başarmak için birçok olasılık var. Senaryonuzda hangisinin en uygun olduğunu seçmek size kalmış.


GÜNCELLEME:

Yorumlar bölümünde istendiği gibi, ana sayfayı seçecek bir eylem filtresi örneği:

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 ardından istediğiniz düzeni belirten bu özel özellik ile bir denetleyici veya eylem süsleyin:

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

1
@DarinDimitrov Nerede oluşturacağım LayoutInjecterAttribute. ? Belirli bir yer var mı?
kbvishnu

2
@VeeKeyBee, bir ActionFiltersalt klasörün içine koyabilirsiniz .
Darin Dimitrov

LayoutInjecterAttributeAşağıdakilerle ilgili olası bir sorun : Denetleyicinin yönteminden önce çağrılır OnException. Bu nedenle, denetleyici özel durum işleme sırasında bir görünüm sonucu sağlarsa, düzen ayarlanmaz.
Jeff Sharp

MVC'ye yeni bir adam olarak, bu cevapta bana çok şey öğrettiğiniz için teşekkür etmek istiyorum. Ancak içeride neler olduğunu anlamıyorum OnActionExecuted. Lütfen benim için cevabı güncelleyebilir misin?
Imad

29

Bir başka yöntem de Görünüm içindeki Düzeni Tanımlamaktır:

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

Yapmanın daha fazla yolu, burada bulunabilir , umarım bu birisine yardımcı olur.


1
Bu çalışmaz - ayrı _ViewStart.cshtml olmadan, görünümünüz diğer düzende @RenderBody () yönteminin içinde görüntülenmeye devam eder.
Tillman32

Bu! Tüm yapmanız gereken bu olduğunda neden herkes bu son derece karmaşık süreçleri ortaya koyuyor?
George Harnwell

15

Bu yöntem, yeni başlayanlar için ASP.NET MVC uygulamanızda Düzen oluşturma işlemlerini denetlemenin en basit yoludur. Denetleyiciyi tanımlayabilir ve Layouts'u par denetleyicisi olarak oluşturabiliriz, bunun için kodumuzu Views klasörünün kök dizinindeki _ViewStart dosyasına yazabiliriz. Aşağıda bunun nasıl yapılabileceğini gösteren bir örnek verilmiştir.

@{
    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 Oku burada "ASP.NET MVC farklı bir Layout Render için"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.