2012-08-30 16 views
12

Genellikle formlarımı @ Html.RenderModel ile oluşturuyorum, ancak bu sefer karmaşık bir oluşturma mantığım var ve bunu manuel olarak yapıyorum. Tek bir özellik için bir editör şablonu oluşturmaya karar verdim. Bunu kullanmak ne kadar burada edilirÖzellik için ASP.NET MVC düzenleyicisi şablonu

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<% var modelMetadata = ViewData.ModelMetadata; %> 
<% if (modelMetadata.HideSurroundingHtml) { %> 
    <%= Html.Editor(modelMetadata.PropertyName) %> 
<% } else { %> 
    <% if (!String.IsNullOrEmpty(Html.Label(modelMetadata.PropertyName).ToHtmlString())) { %> 
     <div class="editor-label"><%= Html.Label(modelMetadata.PropertyName) %></div> 
    <% } %> 
    <div class="editor-field"> 
     <%= Html.Editor(modelMetadata.PropertyName) %> 
     <%= Html.ValidationMessage(modelMetadata.PropertyName) %> 
    </div> 
<% } %> 

Ve: İşte (varsayılan nesne editörü şablon uygulamasından yapıştırılan kopya) kodudur

@Html.EditorFor(x => x.SomeProperty, "Property") //"Property" is template above 

Ama işe yaramadı: etiketler DisplayName bakılmaksızın oluşturulur ve editörler hiç işlenmemiş (Saatler Html.Editor'da (modelMetadata.PropertyName boş dizgeyi gösterir.) Neyi yanlış yapıyorum?

cevap

0

"x.SomeProperty" ne tür bir şeydir? türü Mülkiyet adı verilir

MyModel.cs

public class MyModel 
{ 
    public Property SomeProperty { get; set; } 
} 

Property.cs

public class Property 
{ 
    [Display(Name="Foo")] 
    public int Value { get; set; } 
} 

Görüntüleme/Paylaşımlı/EditorTemplates/Property.cshtml

@model MvcApplication1.Models.Property 

@Html.LabelFor(model => model.Value) 
@Html.EditorFor(model => model.Value) 
@Html.ValidationMessageFor(model => model.Value) 

MyView.cshtml

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

EditorFor yardımcısı için templatename sağlamazsanız, adının SomeProperty'nin tip ile eşleştiği editortemplate öğesini bulur.

Güncelleme:

yapmanız dize için özel editortemplate yapmak için:

Modeli

public class MyModel 
{ 
    public string SomeProperty { get; set; } 
} 

Görünüm:

@Html.EditorFor(model => model.SomeProperty,"Property") 

Veya alternatif:

Modeli:

public class MyModel 
{ 
    [DataType("Property")] 
    public string SomeProperty { get; set; } 
} 

Görünüm:

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

Görüntüleme/Paylaşımlı/EditorTemplates/Property.cshtml:

@model string 

@Html.Raw("I'm using property editortemplate:") 
@Html.Label(ViewData.ModelMetadata.PropertyName) 
@Html.Editor(ViewData.ModelMetadata.PropertyName) 
@Html.ValidationMessage(ViewData.ModelMetadata.PropertyName) 
+0

SomeProperty tip dizesi, yani metin kutusu – SiberianGuy

+0

ben dize için şablon gerekmez güncellenen cevabı –

+0

gör hale bekliyoruz, ben Tamam şimdi anladım herhangi mülk – SiberianGuy

12

Sen düzenleyicinizden editörü çağırıyor. @ RPM1984, this numaralı yazıda @ darin-dmitrov'u yeniden yorumladı: Belirli bir Görüntülemede belirli bir bağlam için, çalışma zamanında kullanılan 1 şablona yalnızca., Karar vermeniz gerekir

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<% var modelMetadata = ViewData.ModelMetadata; %> 
<% if (modelMetadata.HideSurroundingHtml) 
    { %> 
    <%= Html.Editor(modelMetadata.PropertyName) %> 
<% } 
    else 
    { %> 
    <% if (!String.IsNullOrEmpty(modelMetadata.DisplayName)) 
     { %> 
     <div class="editor-label"><%= Html.Label(modelMetadata.PropertyName) %></div> 
    <% } %> 
    <div class="editor-field"><%= Html.TextBox(modelMetadata.PropertyName) %> <%= Html.ValidationMessage(modelMetadata.PropertyName) %></div> 
<% } %> 

bir şey başka yerine metin kutusu (yani açılır liste) işlemek isterseniz:

yerine editörün metin kutusu işlemek için görünümünüzü değiştirirseniz

, bu sadece çalıştı, çalışıyor Bu özellik için şablonunuzun içinde ve onu render. Daha editörler için ortak bir şey varsa Veya, ben varsa render etiketi önlemek için, GörünenAd bakılmaksızın oluşturulur etiketleri konusunda genellikle Paylaşılan klasörde kısmi görünüm içine o ayıklamak ve sadece Html.Partial("ViewName")

kullanmak Ve !String.IsNullOrEmpty(modelMetadata.DisplayName) (zaten ana kod bloğunda bu şekilde koymak) için hiçbir görünen ad,

dÜZENLEME Bu düzenleme varsayılan editörü şablonu object.ascx ilgili sorunun inceler atıfta senin eğer koşulu değiştirin. Bu Brad Wilson's blog alınan object.ascx kod gibidir:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<% if (ViewData.TemplateInfo.TemplateDepth > 1) { %> 
    <%= ViewData.ModelMetadata.SimpleDisplayText%> 
<% } 
    else { %>  
    <% foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit 
         && !ViewData.TemplateInfo.Visited(pm))) { %> 
     <% if (prop.HideSurroundingHtml) { %> 
      <%= Html.Editor(prop.PropertyName) %> 
     <% } 
      else { %> 
      <% if (!String.IsNullOrEmpty(Html.Label(prop.PropertyName).ToHtmlString())) { %> 
       <div class="editor-label"><%= Html.Label(prop.PropertyName) %></div> 
      <% } %> 
      <div class="editor-field"> 
       <%= Html.Editor(prop.PropertyName) %> 
       <%= Html.ValidationMessage(prop.PropertyName, "*") %> 
      </div> 
     <% } %> 
    <% } %> 
<% } %> 

Bu kod gerçekten düzenleyici içinden Html.Editor çağırır, ancak karmaşık modeli özellikleri için düzenleyici listesini oluşturan bir döngü içinde. Bu çağrıların her biri karşılık gelen editörleri (yani dizge için string.ascx vb. Gösterecektir) ve sadece dizge olmayan bir "bilinmeyen" özelliği varsa ve bunun için özel bir düzenleyici (yani bayt []) çağırır bunun için object.ascx çağırmak, ancak bu dEĞİL geçerli özellik için editörü (yapmaya çalıştığınız ne) çağırarak geçerli:

nesne şablonun başlıca sorumluluğu karmaşık nesnesinin tüm özelliklerini sergiliyor

, her özellik için etiketlerle birlikte. Bununla birlikte, modelin NullDisplayText değerini boş göstermesi de sorumludur ve aynı zamanda yalnızca bir düzey mülkün (bir nesnenin sığ bir dalı olarak da bilinir) gösterilmesini sağlamaktan sorumludur. Bir sonraki blog yayında, "derin dalış" işlemleri de dahil olmak üzere bu şablonu özelleştirmenin yolları hakkında konuşacağız. Aynı özellik için

Daha editörler temelde işlevsel farklılıklara çözüm (evet için "/ hayır burada radyo grubunu istiyor ve orada açılan):

Kısa versiyon ÖZETİ


"ve görsel farklılıklar için, kısmi görünümler kullanılmalıdır, çünkü onları istediğiniz kadar yuvalayabilirsiniz, çünkü bunları açıkça isimle adlandırın, böylece hiçbir sınırlama yoktur, herhangi bir potansiyel yinelemeyi önlemekten siz sorumlusunuz.

Uzun versiyon:

ben de aynı sorun var, ben <li> veya <td> elemanını işlemek için editör şablonu kullanıyorum, bu soruşturma yürüttükleri (config/tema bağlı olarak) ve gelen başka bir editör çağrı içeride etiket ve girdi içeren (her iki durum için de aynıdır, ancak özellik bool ise giriş daha önce etikettir), burada tekrar giriş için üçüncü şablonu arıyorum (etiket/giriş ve giriş/etiket senaryoları için çoğaltma kodunu önlemek için), ancak bu çalışmıyor. Msdn veya diğer ilgili kaynaklarda açıklama bulamadım, editörün hiçbir şey vermediği tek senaryonun şu anki editörün bağlamı için editörü oluşturmak istediğiniz zaman olduğunu anladım. quoted: "Belirli bir Görüntülemede belirli bir bağlam için çalışma zamanında kullanılan 1 şablona sahip olabilirsiniz.").Bu konuda biraz daha düşündükten sonra, mülk x'in sadece bir editör kullanılarak oluşturulabileceğinden, şimdi bu limiti uygulamakta haklı olduklarına inanıyorum. Mülk için istediğiniz kadar editöre sahip olabilirsiniz, ancak bir özelliği birden fazla şablon kullanarak bir kez oluşturamazsınız. X özelliği oluşturmak için kullandığınız şablonlardan herhangi biri, x özellikli PARTS oluşturmak için başka şablonlar kullanabilir, ancak x (xml) için birden çok kez (aynı veya farklı) edemezsiniz (aynı mantık iki veya daha fazla özelliğe sahip olmak için geçerlidir x (aynı türde) ve aynı modelde)).

geçerli şablonuna geçerli özellik için başka bir şablon eklemek eğer yanında, o anki özellik için şablonlar herhangi bir sayıda zincirleme sağlar ve kolayca böylece tek yönlü Özyinelemeyi neden olabilir ya da başka o stackoverflow götürecektir:)

+0

Evet, editörden editör arıyorum ancak RenderModel'i varsayılan Nesne Düzenleyicisi şablonu ile kullandığınızda aynı şey gerçekleşir. Ve nesne editörü şablonu için çalışır. Peki kodum bundan nasıl farklı? – SiberianGuy

+1

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html adresinden varsayılan şablonlara başvuruyor musunuz? Bir fark var, prop.PropertyName karmaşık modellerin özellikleri için editörü aramak için kullanılır, modelin kendisi için <% = ViewData.ModelMetadata.SimpleDisplayText%> kullanılır. Unutmayın ki tüm özellikler için varsayılan düzenleyicileri çağrılacak, yani string özelliği vb. Için dize, yani eğer "spesifik" editör yok ise, bu "bilinmeyen" nesne düzenlenemediği için görüntüleme metniyle nesneyi çağırır. –

+0

Haklısınız, sorun burada bir çeşit özlem var. Ama aslında ASP.NET MVC'nin bunu çözememesinin bir nedenini görmüyorum. – SiberianGuy