ASP.NET MVC 3 - kısmi vs ekran şablonu vs Editör şablonu


303

Yani, başlık kendisi için konuşmalıdır.

ASP.NET MVC'de yeniden kullanılabilir bileşenler oluşturmak için 3 seçeneğimiz var (bahsetmediğim diğerleri olabilir):

Kısmi görüntü:

@Html.Partial(Model.Foo, "SomePartial")

Özel Editör Şablonu:

@Html.EditorFor(model => model.Foo)

Özel Ekran Şablonu:

@Html.DisplayFor(model => model.Foo)

Gerçek Görünüm / HTML açısından, her üç uygulama da aynıdır:

@model WebApplications.Models.FooObject

<!-- Bunch of HTML -->

Benim sorum şu - üçünden hangisini kullanacağına ne zaman / nasıl karar veriyorsunuz?

Gerçekten aradığım şey, cevapları hangi şablonun kullanılacağına karar vermek için kullanılabilecek bir tane oluşturmadan önce kendinize sormanız gereken soruların bir listesidir.

EditorFor / DisplayFor ile daha iyi bulduğum 2 şey:

  1. HTML yardımcılarını oluştururken model hiyerarşilerine saygı duyarlar (örneğin, "Foo" modelinizde "Bar" nesneniz varsa, "Bar" için HTML öğeleri "Foo.Bar.ElementName" ile oluşturulurken, bir kısmi " ElementName ").

  2. Daha sağlam, örneğin List<T>ViewModel'inizde bir şey varsa, kullanabilirsiniz @Html.DisplayFor(model => model.CollectionOfFoo)ve MVC, bir koleksiyon görecek ve her öğe için tek bir ekranı görüntüleyecek kadar akıllıdır (bir Kısmi yerine, döngü).

Ayrıca DisplayFor "salt okunur" bir şablon oluşturur duydum, ama ben bunu anlamıyorum - orada bir form alamadı?

Birisi bana başka nedenler söyleyebilir mi? Bir yerde üçünü karşılaştıran bir liste / makale var mı?


Editör ve ekran şablonlarının arkasındaki kavramlar asp.net mvc 2 belgelerinde açıkça tanımlanmıştır. Şablonlar, belirli bir kurala uygun olan kısmi öğelerdir. Şablonları eski kısmi parçalardan daha iyi veya daha kötü yapan durumlar, sözleşmenin uygulamanızda uymaya değip değmeyeceğine neredeyse tamamen bağlıdır.
Nick Larsen

Yanıtlar:


301

EditorForvs DisplayForbasittir. Yöntemlerin semantiği, sırasıyla düzenleme / ekleme ve görüntüleme / salt okunur görünümler oluşturmaktır. DisplayForVerileri görüntülerken kullanın (örn. Model değerlerini içeren div ve açıklıklar oluştururken). EditorForVeri düzenlerken / eklerken kullanın (örn. Bir formun içinde giriş etiketleri oluştururken).

Yukarıdaki yöntemler model merkezlidir. Onlar (hesaba modeli meta alacak örneğin siz ile model sınıf açıklama verebilecek Bu araç [UIHintAttribute]ya [DisplayAttribute]ve bu model için UI oluşturmak için seçildiyse hangi şablonu etkileyecektir. Bunlar da genellikle (veri modelleri için yani modeller kullanıldığını veritabanındaki satırları gösterme vb.)

Öte yandan Partial, çoğunlukla doğru kısmi görüşü seçmekle ilgilenmeniz açısından görüntüleme merkezlidir. Görünümün düzgün çalışması için bir modele gereksinimi yoktur. Site genelinde yeniden kullanılan ortak bir işaretleme kümesine sahip olabilir. Tabii ki çoğu kez bu kısmi davranışını etkilemek istersiniz, bu durumda uygun bir görünüm modeline geçmek isteyebilirsiniz.

@Html.ActionHangisinin de burada bir sözü hak ettiğini sormadınız . PartialBir denetleyici alt eylemini yürütmesi ve daha sonra bir görünüm oluşturması (genellikle kısmi bir görünümdür) olarak daha güçlü bir sürümü olarak düşünebilirsiniz . Bu önemlidir, çünkü çocuk eylemi kısmi bir görüşe ait olmayan ek iş mantığı yürütebilir. Örneğin, bir alışveriş sepeti bileşenini temsil edebilir. Bunun nedeni, alışveriş sepetiyle ilgili çalışmanın uygulamanızdaki her denetleyicide yapılmasından kaçınmaktır.

Sonuçta seçim, uygulamanızda modellemenin ne olduğuna bağlıdır. Ayrıca karıştırıp eşleştirebileceğinizi unutmayın. Örneğin, EditorForyardımcıyı çağıran kısmi bir görünümünüz olabilir . Bu, uygulamanızın ne olduğuna ve tekrardan kaçınarak maksimum kodun yeniden kullanılmasını teşvik etmek için nasıl faktörlere bağlı olduğuna bağlıdır.


4
Bu harika bir cevap, tam olarak aradığım şey. Gerçekte, gelip buna cevap vereceğiniz konusunda bankacılık yapıyordum. :) Teşekkürler marcin.
RPM1984

Tek bir mülk için bir görüntüleme şablonu ve bir düzenleyici şablonu belirtmek için ek açıklamaları nasıl kullanırsınız?
stormwild

3
@stormwild, kongreyi kullanır ve şablonlarını ilişkili oldukları modelden sonra (/Views/DisplayTemplates/MyModel.cshtml) olarak adlandırır veya UIHint ek açıklamasıyla açıkça zorlar.
Tom Wayson

Herhangi bir öneri yeniden kullanılabilir "kayıt kullanıcı" sihirbazı oluşturmak için seçmek için? Mümkünse bu görünümleri (ve denetleyicileri) ayrı bir montajda oluşturmak istiyorum. Aka, bu yeniden kullanılabilir mvc formları / denetleyicileri birkaç takım arasında yeniden dağıtmanın bir yolu. (kullanıcı / depolamayı ele almak için tek bir yol oluşturduk (webapi hizmetleri) ... ancak her takım kendi mvc sayfalarını oluşturuyor: <Teşekkürler
granadaCoder

Bu şablonları nerede saklıyorsunuz? Bunları Shared / EditorTemplates'te saklamam gerekiyor mu yoksa doğrudan geçerli denetleyici klasöründe saklamak mümkün mü (yalnızca orada ihtiyacım olduğunda)?
Santhos

15

Kesinlikle olabilir özelleştirmek DisplayFordüzenlenebilir formunu görüntülemek için. Ama kongre içindir DisplayForolmak readonlyve EditorFordüzenleme için olmak. Kurallara uymak, ne geçerseniz geçsin DisplayForaynı türden bir şey yapmasını sağlayacaktır.


2
Gerçekten ne zaman bir ekran şablonları vs editör şablonları kullanması gerektiği konusunda herhangi bir soru / şüphe olduğunu sanmıyorum. Asıl soru, şablonlar ile kısmi karşılaştırmanın ne zaman kullanılması gerektiği gibi görünüyor. Cevabınız bunu tamamen özlüyor.
Joshua Hayes

19
@Joshua - Ben bunun için bir soru olduğunu düşünüyorum: "Ben de DisplayFor" salt okunur "bir şablon oluşturur duydum, ama ben anlamıyorum - orada bir form alamadı?"
Robert Levy

13

Sadece 2c değerimi vermek için, projemiz birkaç jQuery sekmesine sahip kısmi bir görünüm kullanıyor ve her sekme kendi kısmi görünümüyle alanlarını oluşturuyor. Bazı sekmelerin bazı ortak alanları paylaştığı bir özellik ekleyene kadar bu işe yaradı. Buna ilk yaklaşımımız, bu ortak alanlarla başka bir kısmi görünüm oluşturmaktı, ancak alanları oluşturmak ve aşağı inmek için EditorFor ve DropDownListFor'u kullanırken bu çok karmaşıklaştı. Kimlikleri ve adları benzersiz hale getirmek için, alanları oluşturan üst kısmi görünüme bağlı olarak alanları bir önekle oluşturmamız gerekiyordu:

    <div id="div-@(idPrefix)2" class="toHide-@(idPrefix)" style="display:none">
    <fieldset>
        <label for="@(idPrefix).Frequency">Frequency<span style="color: #660000;"> *</span></label>

        <input name="@(idPrefix).Frequency"
               id="@(idPrefix)_Frequency"
               style="width: 50%;"
               type="text"
               value="@(defaultTimePoint.Frequency)"
               data-bind="value: viewState.@(viewStatePrefix).RecurringTimepoints.Frequency"
               data-val="true"
               data-val-required="The Frequency field is required."
               data-val-number="The field Frequency must be a number."
               data-val-range-min="1"
               data-val-range-max="24"
               data-val-range="The field Frequency must be between 1 and 24."
               data-val-ignore="true"/>

        @Html.ValidationMessage(idPrefix + ".Frequency")

        ... etc

    </fieldset>
</div>

Bu oldukça çirkinleşti, bunun yerine Editör Şablonlarını kullanmaya karar verdik. Ortak alanlara yeni bir Görünüm Modeli ekledik, eşleşen bir Düzenleyici Şablonu ekledik ve alanları farklı üst görünümlerden Düzenleyici Şablonu kullanarak oluşturduk. Editör Şablonu kimlikleri ve adları doğru bir şekilde oluşturur.

Kısacası, Editör Şablonlarını kullanmamızın zorlayıcı bir nedeni, bazı ortak alanları birden çok sekmede oluşturma gereğiydi. Kısmi görünümler bunun için tasarlanmamıştır, ancak Editör Şablonları senaryoyu mükemmel şekilde ele alır.


1
Sekmeleri kullanarak benzer bir sorun yaşadım ve Steve Sanderson'un sizin için benzersiz kontrol kimlikleri üreten BeginCollectionItem'i kullandım: blog.stevensanderson.com/2010/01/28/…
Wilky

1

Aşağıdaki durumlarda _partialgörünüm yaklaşımını kullanın:

  1. Merkezli Mantığı Görüntüle
  2. _partialGörünümle ilgili tüm HTML’leri yalnızca bu görünümde tutmak için ne gerekir . Şablon yönteminde, HTML Görünümünü "Ana Üstbilgi veya herhangi bir dış kenarlık / ayar gibi" Şablon Görünümü dışında tutmanız gerekir.
  3. Kullanarak mantık (denetleyiciden) ile kısmi görünüm oluşturmak istiyorum URL.Action("action","controller").

Şablon kullanma nedenleri:

  1. Kaldırmak istiyorum ForEach(Iterator). Şablon, Modeli bir liste türü olarak tanımlamak için yeterlidir. Otomatik olarak yapacak.
  2. Model Merkezli Mantık. Aynı klasörde aynı klasörde birden çok görünüm bulunursa, oluşturma Geçti Modeline bağlı olacaktır.

1

Bugüne kadar söz edilmemiştir başka fark, bir şablon yok iken bir partialview modeli eklerler olmamasıdır İşte konudur

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.