2013-04-05 20 views
5

Bir css sınıfını MvcHtmlString içinde kapsüllenmiş bir HTML öğesine enjekte etmek mümkün mü?Bir MvcHtmlString'e bir css sınıfı nasıl enjekte edilir?

Ben şu uyarılar ile, form elemanları (TextBox, TextBoxFor<>, vs) için MVC uzantısı yöntemleri kendi sürümlerini oluşturarak birlikte, inşa ediyorum çerçevesinin bir parçası olarak, görevli oldum:

  • , site için önceden tasarlanmış olan stilleri eşleştirmek için CSS sınıfları dahil olmak üzere doğru HTML biçimlendirmesini oluşturmaları gerektiğini. Çoğu durumda, bu sadece belirli bir sınıfın eklenmesi anlamına gelir.
  • geliştiriciler MVC uzantısı yöntemleri bir MvcHtmlString yüzden basit yolu döndürmez hepsi eğer

çoğu taklit etmek bunları kullanarak rahat hissetmeleri mümkün olduğunca MVC uzantısı yöntemlerine kadar doğru olması gerektiğini işlevsellik, bu yöntemleri doğrudan yöntemlerimden çağırmaktır.

`@ Ou.TextBoxFor (m =>: Ben çerçeve kullandığını, geliştiriciler çizgisinde bir şey çağırır, bir TextBox örneğin oluşturmak isteyen nedenle, Html Yardımcısı, OuHelper kendi var m.Username)

Ve şöyle işlemek için çıkan Html istiyorum:

<input type="text" name="Username" id="Username" class="int-text" />

MVC çerçevesinde olduğu gibi kendi aşırı sürümlerimin kendi sürümlerini oluşturursam, gerektiğinde fazladan CSS sınıflarını eklemeyi kontrol edebilirim, ancak bu yöntemlerden bu tür küçük bir HTML çıktısı değişikliği için çok fazla bir şey gibi görünebilir. Tüm aşırı yüklenmelerin eşdeğer uygulamalarını sağlamanız gerekir (yalnızca TextBox için jenerik ve jenerik olmayan sürümleri saydığınızda yaklaşık 12 tane vardır). Yapmak istediğim şey, TagBuilder tersine (çıktıyla başlayıp, MergeAttributes gibi şeylerin kullanılabilir olmasını sağlayacak bir nesne oluşturuyor) ancak bunun mümkün olduğunu düşünmüyorum.

Net olmak gerekirse: Yazmakta olduğum çerçeve kodunun css sınıflarının kendisinin eklenmesi gerekiyor, ancak geliştiriciler için oluşturduğum uzantı yöntemlerini kullanarak kendi özel css sınıflarını da eklemek mümkün olmalıdır. Bunlar

cevap

3

Bir var gibi Şu anda oldukça iyi bir sistem. HtmlHelper sınıfları için varsayılan stilleri enjekte edemez/geçersiz kılabilirsiniz, isterseniz HtmlHelper's input extensions here kaynağına bakabilirsiniz.

Bunu yapmayı düşünebilmemin tek yolu, gerçek ASP.NET kaynağında nasıl yapıldığı gibi uzantı yöntemleri kullanıyor olabilir. İşte bir örnek, fonksiyonun adı istediğiniz herhangi bir şey olabilir ama aynı parametre listesine sahip olduğundan TextBoxFor'dan farklı olması gerekiyor.

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString IntTextFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
    { 
     return htmlHelper.TextBoxFor(expression, new { @class = "int-text" }); 
    } 
} 

Kullanımı düzenli MVC sadece uzatma yöntemi (ler) in ad dahil gibi olacaktı.

@using MyProject.Helpers; 

@Html.IntTextFor(e => e.Age) 
+0

Alkışlar Daniel - evet, sanırım bu çizgiler boyunca bir şeyler yapacağım. Çok fazla aşırı yüklenme yapmak zorunda kalmamayı umuyordum ama MVC çerçevesi halihazırda sağladığı gibi aynı esnekliği sağlamalıyım. Bazı uzantı yöntemleri oluşturacağım ve sınıfı html özniteliklerine gerektiği gibi birleştireceğim (böylece, çerçevemi kullanan geliştiriciler de gerektiğinde kendi özel sınıflarını ekleyebilirler) – levelnis

0

satır içi stili için bu

@Ou.TextBoxFor(m => m.Username,new{@Class="your class Name"}) 

veya gibi yapabilirsiniz standart MVC framework formu uzatma yöntemlerinin işlevselliği göre eklenen/eklenebilir

@Ou.TextBoxFor(m => m.Username,new{@style="font-size:10px"}) 
İlgili konular