_ViewStart.cshtml mizanpaj dosyası nereye ve nasıl bağlanır?


199

İşte varsayılan MVC 3 şablonundan About.cshtml:

@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
     Put content here.
</p>

_ViewStart dosyasına bir başvurunun içinde bulunacağını beklerdim About.cshtml, ama açıkça değil.

Ben baktım global.asaxve web.config, ama nasıl About.cshtml_ViewStart dosyasındaki düzen ile nasıl "bağlantı" olduğunu bulamıyorum.

Her şey beklendiği gibi çalışıyor, sadece kaputun altında neler olup bittiğini bilmek istiyorum ...

Yanıtlar:


237

Gönderen ScottGu günlüğü :

ASP.NET MVC 3 Beta sürümünden başlayarak, projenizin \ Views klasörünün altına _ViewStart.cshtml (veya VB için _ViewStart.vbhtml) adlı bir dosya ekleyebilirsiniz:

_ViewStart dosyası, her Görünümün oluşturulmasının başlangıcında yürütmek istediğiniz ortak görünüm kodunu tanımlamak için kullanılabilir. Örneğin, her Görünüm için Düzen özelliğini varsayılan olarak SiteLayout.cshtml dosyası olacak şekilde programlı olarak ayarlamak için _ViewStart.cshtml dosyamızda kod yazabiliriz:

Bu kod her Görünüm'ün başlangıcında yürütüldüğünden, artık Düzen'i tek tek görünüm dosyalarımızdan herhangi birinde açıkça ayarlamamız gerekmiyor (yukarıdaki varsayılan değeri geçersiz kılmak istesek hariç).

Önemli: _ViewStart.cshtml kod yazmamıza izin verdiğinden, isteğe bağlı olarak Mizanpaj seçim mantığımızı temel bir özellik kümesinden daha zengin yapabiliriz. Örneğin: kullandığımız Mizanpaj şablonunu, siteye ne tür bir cihaza eriştiğine bağlı olarak değiştirebiliriz - ve bu cihazlar için telefon veya tablet için optimize edilmiş bir düzeneğe ve PC'ler / Dizüstü Bilgisayarlar için masaüstü için optimize edilmiş bir düzene sahip olabiliriz. Veya birden fazla müşteri arasında kullanılan bir CMS sistemi veya ortak paylaşılan uygulama oluşturuyor olsaydık, siteye erişirken müşteriye (veya rollerine) bağlı olarak kullanılacak farklı düzenler seçebiliriz.

Bu, çok sayıda UI esnekliği sağlar. Ayrıca, görünüm mantığını bir kez daha kolayca yazmanıza ve birden fazla yerde tekrar etmekten kaçınmanıza olanak tanır.

Ayrıca bakınız bu .


14
Yani aşağı yukarı MVC3'ün "kodlanmış" bir özelliği mi? Başka bir "varsayılan" sayfaya değiştirmeye gerek yok, sadece nasıl kurulduğunu merak ediyorum. Hepsini
ayırdığınız

2
Kman- Hardcoded, kongre ile (burada başka bir 'tutamaç' seçin :)) - yani evet, tam olarak. sevindim sis temizledi
jim tollan 15:12 '

İhtiyacınız olabilecek sadece "Views" klasörünüzde değil. Diğer klasörlere görünümleri düzenlemek için özel bir RazorViewEngine eklerseniz, dosyayı bu alternatif görünüm klasörlerinin köküne de eklemeniz gerekir. Örneğin, tüm Inspinia şablon görünümlerini bir klasöre taşıdım ve bunu görünüm motorunda çalıştırdım ViewLocationFormats = ViewLocationFormats.Union(new string[] { "~/Inspinia/ExampleViews/{1}/{0}.cshtml" }).ToArray();. Sonuç olarak, _ViewStart.cshtml dosyasının bir kopyasını "~ / Inspinia / SampleViews" dosyasına eklemek zorunda kaldım, aksi takdirde alınmadı ve bir düzen ayarlanmadı.
Triynko

2
Views klasörünüzde alt klasörler varsa _ViewStart, her alt klasöre o alt klasördeki görünümlere bağlanacak bir a koyabilir misiniz ?
toddmo

35

Daha genel anlamda, MVC çerçevesinin _Viewstart.cshtml hakkında "bilmesi" yeteneğine "Kural ile kodlama" adı verilir .

Konfigürasyon üzerine sözleşme (sözleşmeyle kodlama olarak da bilinir), geliştiricilerin vermesi gereken kararların sayısını azaltmayı, basitliği kazanmayı, ancak esnekliğini kaybetmeyi amaçlamayan bir yazılım tasarımı paradigmasıdır. Cümle aslında bir geliştiricinin yalnızca uygulamanın alışılmadık yönlerini belirtmesi gerektiği anlamına gelir. Örneğin, modelde bir Sınıf Satış varsa, veritabanındaki ilgili tabloya varsayılan olarak "satış" adı verilir. Bu sözleşmeden ancak “ürünler_sold” tablosunu çağırmak gibi bir sapma varsa, bu isimlerle ilgili kod yazması gerekir.

Vikipedi

Bunda sihir yok. Sadece MVC çerçevesinin temel kod tabanına yazılmıştır ve bu nedenle MVC'nin "bildiği" bir şeydir. Bu nedenle .config dosyalarında veya başka bir yerde bulamazsınız; aslında MVC kodunda. Ancak bu kuralları değiştirmek veya geçersiz kılmak için geçersiz kılabilirsiniz.


13
MVC bunu biliyorsa, neden Visual Studio bunu bilmiyor ve bana işaret etmiyor? Konvansiyonla kodlama, konvansiyonu
bozmamak

Konvansiyonu çiğnememek önemli bir husustur. AKAIK Ruby on Rails de bu paradigmayı takip ediyor.
Umar Farooq Khawaja

+1 Raif. Kötü belgelenmiş "sözleşmeye göre kodlamayı" savunmanın bir anlamı yoktur. Bunu geriye doğru kodlarımdan herhangi biri hakkında söyleyebilirim. “Ne? 33'e geldiğinde çökmesini beklemiyordun mu? Herkes 33'ü atladığını biliyor.” Ne yazık ki, ASP.NET MVC için belge boşluğu çok büyük. Yalnızca MS dokümanları, dahili kaynak özeti olmadan otomatik olarak oluşturulur.
shannon

6
Konfigürasyon üzerine anlaşma, onu değiştiremeyeceğiniz anlamına gelmez. Söz konusu dosyanın adını ve konumunu belirleyebilecek bir yapılandırma olmalıdır. Çok iyi olabilir ama kim olduğunu bilebilir. İnsanlar, bir kod tabanında çok sayıda kötü kararın üstesinden gelmek için "yapılandırma konvansiyonu" mantrasını kullanıyorlar ve "sadece işe yarayan" kötü belgelenmiş dağınıklıklarını korumak için gerçekte ortaya çıkan adam olarak beni kızdırıyorlardı (ama Tanrı'yı ​​bir şeyi değiştirmenizi yasaklayın - her şeyi nasıl kırdığınızı anlamak için saatler harcayacaksınız).
Robert C. Barth

3
@AidenStrydom katılmıyorum. Kabul edilen cevap aslında _ViewStart'ın nasıl kullanılacağını anlatıyor. Bu cevap sadece bir tasarım konseptinden bahsediyor. Buraya _ViewStart hakkında bilgi almak için geldim, Visual Studio'nun neden _ViewStart hakkında bana bir şey söylemediği hakkında bilgi değil.
Millie Smith

23

Sadece başka bir düşünce.

Kendi cshtmldosyanızı ortak bir şablon olarak kullanmak istiyorsanız, bunu bu şekilde yapabilirsiniz

_viewstart.cshtmlSizin içinde ortak cshtmldosyanızdan bahsedebilirsiniz .

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

14

Kaynak kodu, bunu aramak için dokümantasyondan çok daha iyi bir yerdir.

Github'dan MVC 6 koduna referansla, ilgilenen birkaç dosyamız var

----Güncelleme----

Kaynak yapı değişiklikleri nedeniyle, görünüm başlatma sayfalarının nasıl toplandığı hakkındaki bilgiler artık RazorViewEngine.cs içinde "GetViewStartPages" işlevini arayabilir.

----/Güncelleme----

Onlar oyun, bakmak girer nasıl cevaplamak için RazorView MVC boru hattına bağlanmış olan (çünkü IView ait) inan. Bu dosya, istenen görünümü oluşturmak için MVC ardışık düzeninden çağrılan bir RenderAsync yöntemine sahiptir.

RenderAsync, RenderPage ve SONRA RenderLayout'a çağrı yapar (SİPARİŞ NOTU). RenderPage önce viewstart dosyalarıyla başa çıkmak için çağrı yapar (çoğul, birden fazla _viewstart dosyası olabilir).

Böylece, aradığınız bilgiler Microsoft.AspNet.Mvc.Razor ad alanı altındaki RazorView.cs dosyasındaki RenderViewStartAsync işlevinden edinilebilir.


7

Bu, şimdi bu soruya bazı ek bilgiler ekleyebilir (2016 ala MVC4, MVC5).

Razor motoru , _ViewStart.cshtml dosyasının bulunduğu dizin veya alt dizinde bulunan diğer tüm kodlardan önce _ViewStart.cshtml içindeki kodu bulur ve çalıştırır .

Herhangi bir görünüm, Layout özelliğini veya değerlerinden herhangi birini geçersiz kılabilir .

Sadece neden _ViewStart olduğunu göstermek için biraz daha fazla bilgi ekleyebileceğimi düşündüm.

Eğer alırsanız ILSpy ve RazorViewEngine kod incelemek (System.Web.Mvc.dll) kod kendisi bu ismi başvuran göreceksiniz.

System.Web.Mvc.dll dosyasında _ViewStart

RazorViewEngine'in şu ada sahip bir dosya aradığını görebilirsiniz:

motor kodu

RazorViewEngine.ViewStartFileName = "_ViewStart";

3
aradığım şey bu, projemde neler olduğunu "bilmiyorum" dan nefret ediyorum, çünkü VS için de kendi şablonlarımı yapıyorum ve havadan çıkan bu dosyayı anlamak çok
kullanışlı değildi

1

Sayfalarınız için ortak bir mizanpaja sahip olmak istiyorsanız, ortak mizanpajı tanımlamanız ve bir görünümü mizanpaj ile ilişkilendirmeniz gerekiyorsa, her görünümde mizanpaj özelliğini ayarlamamız gerekir; bu, KURU (Kendinizi Tekrarlama) ilkesini ihlal eder. Bunun için .Net Framework, görünüm klasörünün içine yerleştirilmiş "_ViewStart.cshtml" dosyasını sağlamıştır. Düzen bilgilerini "_ViewStart.cshtml" dosyasına yerleştiriyoruz ve varsayılan olarak her görünüm bu düzen bilgilerini kullanıyor. Bazı farklı düzen bilgileri vermek istiyorsanız, Ana görünümünüze bakalım, bu düzene referansla yeni bir "_ViewStart.cshtml" oluşturabilir ve "Ana Görünüm" klasörüne yerleştirebilirsiniz.


1

Kısa yanıt : Herhangi bir görünüm oluşturulduğunda önce ViewStarts başlar. Uzun hikaye aşağıdadır:

Tek bir görünüm dosyası oluşturma hikayesi:

  1. ViewStart, ViewImports ile birleştirilir ve daha sonra tek bir dosya olarak yürütülür. ViewImports her zaman ViewStart dosyası da dahil olmak üzere herhangi bir cshtml dosyası ile birleştirildiğini unutmayın. Amacı @ kullanarak ifadeleri ve diğer yaygın direktifleri özetlemektir.
  2. ViewStart çıktısı (Layout ve ViewData gibi) belirli bir View dosyası için kullanılabilir hale gelir.
  3. View dosyasının içinde, Layout değişkeni null olursa / boşsa, görünümün gövdesi oluşturulur ve son çıktı kullanıcıya iletilir.
  4. Mizanpaj değişkeni null olmazsa, yürütme mizanpaj dosyasına taşınır ve bu da ViewImports ile tek bir dosya olarak birleştirilir ve mizanpaj dosyası içindeki @RenderBody () deyiminde mizanpaj dosyasına geri taşınır bu da ViewImports ile yeniden birleşir ve çıktı @RenderBody () konumundaki mizanpaj dosyası ile birleştirilir ve son çıktı son olarak kullanıcıya iletilir.

Bu, programınızın yaşam döngüsünün bilinmeyen gizemleri içinde neler olup bittiğinin farkında olmanızı umar.

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.