Soru ASP.NET MVC 3 - Kısmi vs Ekran Şablonu vs Editör Şablonu


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 başkaları 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, üç uygulamanın hepsi aynıdır:

@model WebApplications.Models.FooObject

<!-- Bunch of HTML -->

Öyleyse, sorum şu: üçün hangisinin kullanılacağına ne zaman / nasıl karar veriyorsunuz?

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

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

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

  2. Daha sağlam, ör. List<T> ViewModel'inizdeki bir şeyin @Html.DisplayFor(model => model.CollectionOfFoo)ve MVC bir koleksiyon olduğunu görecek kadar akıllıdır ve her bir öğe için tek bir ekran oluşturur (Parçanın aksine, açık bir döngü gerektirecektir).

Ayrıca, DisplayFor'un "salt okunur" bir şablon oluşturduğunu duydum, fakat bunu anlamıyorum - orada bir form atamadım mı?

Birisi bana başka sebepler söyleyebilir mi? Üçü karşılaştıran bir yer / liste var mı?


297
2018-02-18 04:22


Menşei


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 sözleşmeye uyan kısmi bölümlerdir. Şablonları eski kısmi parçalardan daha iyi veya daha kötü hale getiren durumlar, sözleşmenin uygulamanıza bağlı olup olmayacağına neredeyse tamamen bağlıdır. - Nick Larsen♦


Cevaplar:


EditorFor vs DisplayFor basit. Yöntemlerin semantiği, düzenleme / ekleme ve görüntüleme / salt okunur görünümleri (sırasıyla) oluşturmaktır. kullanım DisplayFor verileri görüntülerken (yani, model değerlerini içeren div ve kapsamlar oluşturduğunuzda). kullanım EditorFor Verileri düzenlerken / eklerken (yani, bir form içinde giriş etiketleri oluşturduğunuzda).

Yukarıdaki yöntemler model merkezlidir. Bu, model meta verilerini hesaba katacakları anlamına gelir (örneğin, model sınıfınızı şu şekilde açıklayabilirdiniz: [UIHintAttribute] veya [DisplayAttribute] Bu, model için UI'yi oluşturmak için hangi şablonun seçildiğini etkiler. Genellikle veri modelleri için kullanılırlar (yani, bir veritabanında satırları temsil eden modeller, vb.)

Diğer yandan Partial Görünüm odaklı olup, çoğunlukla doğru kısmi görünümü seçmekle ilgilenirsiniz. Görünümün doğru çalışması için mutlaka bir modele ihtiyacı yoktur. Sitede yeniden kullanılan ortak bir işaretleme kümesine sahip olabilir. Elbette çoğu zaman bu kısmi davranışı etkilemek istersiniz, bu durumda uygun bir görüş modelinde geçmek isteyebilirsiniz.

Sen hakkında sormadın @Html.Action ki burada da bir sözü hak ediyor. Bunu daha güçlü bir versiyon olarak düşünebilirsiniz. Partial Bunun için bir denetleyici alt eylemi yürütür ve daha sonra bir görünüm oluşturur (genellikle kısmi bir görünümdür). Bu önemlidir çünkü çocuk eylemi kısmi görünümde bulunmayan ek iş mantığını çalıştırabilir. Örneğin, bir alışveriş sepeti bileşenini temsil edebilir. Bunu kullanmanın nedeni, alışveriş sepetiyle ilgili çalışmayı uygulamanızdaki her denetleyicide gerçekleştirmekten kaçınmaktır.

Sonuçta seçim, uygulamanızda modellemenize bağlı olarak değişir. Ayrıca karıştırıp eşleştirebileceğinizi de unutmayın. Örneğin, kısmi bir görüşe sahip olabilirsiniz. EditorFor yardımcı. Uygulamanızın ne olduğuna ve tekrar etmekten kaçınırken maksimum kodun yeniden kullanılmasını teşvik etmek için buna nasıl dahil edileceğine bağlıdır.


290
2018-02-18 04:30



Tam olarak aradığım şey bu harika bir cevaptı. Gerçekte, geleceğinize ve buna cevap verdiğine odaklandım. :) Teşekkürler marcin. - RPM1984
Tek bir özellik için bir görüntü şablonu ve düzenleyici şablonu belirtmek için ek açıklamaları nasıl kullanırsınız? - stormwild
@stormwild ya kuralı kullanır ve (/Views/DisplayTemplates/MyModel.cshtml) ile ilişkili olan modelden sonra şablonlarınızı adlandırır veya açıkça UIHint ek açıklamasını zorlar. - Tom Wayson
Yeniden kullanılabilir bir "kullanıcı kaydet" sihirbazı oluşturmak için hangi tavsiyelerde bulunulur? Bu görünümleri (ve denetleyicileri) mümkünse ayrı bir derlemede oluşturmak istiyorum. Aka, bu yeniden düzenlenmiş mvc formları / denetleyicileri birkaç ekip arasında yeniden dağıtmanın bir yolu. (kullanıcı / depolama (webapi hizmetleri) ile uğraşmak için tek bir yol yarattık ... ama her takım kendi mvc sayfalarını yaratıyor: <teşekkürler. - granadaCoder
Bu şablonları nerede saklıyorsunuz? Onları Paylaşımlı / EditorTemplates içinde saklamanız mı gerekiyor yoksa bunları doğrudan geçerli kontrolör klasöründe saklamak mümkün mü (sadece orada ihtiyacım olduğunda)? - Santhos


Kesinlikle sen could özelleştirmek DisplayFor düzenlenebilir bir formu görüntülemek için Ancak sözleşme DisplayFor olmak readonly ve EditorFor düzenleme için Sözleşmeyle uğraşmak, ne olursa olsun, DisplayForAynı şeyleri yapacak.


14
2018-02-18 04:31



Görüntü şablonlarını editör şablonları ile ne zaman kullanması gerektiğine dair bir soru / şüphe olduğunu sanmıyorum. Asıl soru, şablonlar ve kısmi kullanmanız gereken zamanlar gibi görünüyor. Cevabınız bunu tamamen özlüyor. - Joshua Hayes
@Joshua - Bence bunun bir sorusu vardı: "Ayrıca DisplayFor'un" salt okunur "bir şablon oluşturduğunu da duydum, ama bunu anlamıyorum - orada bir form atamadım mı?" - Robert Levy


Sadece 2c değerinde vermemiz için, projemiz birkaç jQuery sekmesi ile kısmi bir görünüm kullanıyor ve her sekme kendi alanlarını kendi kısmi görünümü ile oluşturuyor. Bu, bazı sekmelerin bazı ortak alanları paylaştığı bir özellik ekleyene kadar iyi çalıştı. Bu ilk yaklaşımımız, bu ortak alanlar ile başka bir kısmi görünüm yaratmaktı, ancak bu, alanları ve düşüşleri oluşturmak için EditorFor ve DropDownListFor'u kullanırken çok rahatsız edici oldu. Kimlikler ve adların benzersiz olmasını sağlamak için, alanları oluşturan ana kısmi görünüme bağlı olarak alanları bir önek ile 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 çirkin oldu, bu yüzden çok daha temiz çalışan Editör Şablonları kullanmaya karar verdik. Ortak alanlarla yeni bir Görünüm Modeli ekledik, uyumlu bir Editör Şablonu ekledik ve alanları farklı Üst görünümlerden Editör Şablonunu kullanarak oluşturduk. Editör Şablonu, kimlikleri ve adları doğru bir şekilde oluşturur.

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


13
2018-02-20 21:18



Sekmeleri kullanarak benzer bir sorun yaşadım ve sizin için benzersiz kontrol kimliğini oluşturan Steve Sanderson'ın BeginCollectionItem'i kullanarak sona erdi: blog.stevensanderson.com/2010/01/28/... - Wilky


kullanım _partial yaklaşımı görüntüle:

  1. Merkezsel Mantığı Görüntüle
  2. Neler yapılmalı? _partial İlgili HTML'yi yalnızca bu görünümde görüntüleyin. Şablon yönteminde, Şablon Görünümü dışında "Ana Başlık veya herhangi bir dış kenarlık / ayar" gibi bir HTML bulundurmanız gerekir.
  3. Kullanarak mantıkla (denetleyiciden) kısmi görünüm oluşturmak URL.Action("action","controller").

Şablon kullanma nedenleri:

  1. Kaldırmak istiyorum ForEach(Iterator). Şablon, Modeli liste türü olarak tanımlamak için yeterlidir. Bunu otomatik olarak yapacak.
  2. Model Merkezli Mantık. Şablon göstergesinin aynı görünümünde birden çok görünüm bulunursa, oluşturma işlemi Geçirilmiş Modele bağlı olacaktır.

1
2017-10-05 07:27





Şimdiye kadar değinilmemiş olan bir diğer farklılık, bir şablonun yaptığı bir kısmi görünümün model öneklerini eklememesidir. İşte sorun mu


1
2018-06-14 12:22