2013-04-05 14 views
5

Czy można wstrzyknąć klasę css do elementu HTML, który został zamknięty w ramach MvcHtmlString?Jak wstrzyknąć klasę css do MvcHtmlString?

Mam za zadanie, w ramach ram buduję, z tworzeniem własnych wersje metod rozszerzenie MVC dla elementów formularza (TextBox, TextBoxFor<>, etc), z następującymi zastrzeżeniami:

  • , że muszą utworzyć poprawny znacznik HTML, w tym klasy CSS, aby dopasować style, które zostały już zaprojektowane dla witryny. W większości przypadków oznacza to po prostu dodanie określonej klasy.
  • , że muszą one być tak naprawdę do metod rozszerzenie MVC, jak to możliwe, tak, że deweloperzy czują się komfortowo używając ich

Większość, jeśli nie wszystkie, z rozszerzeniem MVC metody zwracają MvcHtmlString więc najprostszy sposób naśladować Funkcją jest wywoływanie tych metod bezpośrednio z moich metod. Mam własny Html Helper, OuHelper, że mój framework używa, więc deweloperzy, którzy chcą tworzyć, na przykład, TextBox, nazwałbym coś wzdłuż linii:

`@ Ou.TextBoxFor (m => m.Username)

i chciałbym wynikowy HTML do renderowania tak:

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

Jeśli tworzę własne wersje przeciążeń, ponieważ są one w strukturze MVC, będę w stanie kontrolować dodawanie dodatkowych klas CSS tam, gdzie jest to potrzebne, ale to wydaje się przesadą dla tak małej zmiany wyjścia HTML z tych metod. Musiałbym zapewnić równoważne implementacje wszystkich przeciążeń (tylko dla TextBox jest około 12, gdy policzymy wersje ogólne i nietypowe). To, co chciałbym zrobić, to TagBuilder w odwrotnej kolejności (zacznij od wyjścia i stwórz z niego obiekt, który umożliwi dostęp do rzeczy takich jak MergeAttributes), ale nie sądzę, że to możliwe.

Aby było jasne: kod strukturalny, który piszę, musi dodawać same klasy css, ale powinno być możliwe, że programiści używający metod rozszerzeń, które utworzę, dodadzą również własne niestandardowe klasy css. Zostaną one dodane/dołączane zgodnie z funkcjonalnością standardowego MVC metod forma ramy rozszerzeniem

Odpowiedz

3

Wydaje się mieć całkiem dobry system obecnie. Nie można wstrzykiwać/zastępować domyślnych stylów dla klas HtmlHelper, jeśli chcesz, możesz sprawdzić źródło dla HtmlHelper's input extensions here.

Jedyny inny sposób, w jaki mogę to zrobić, to użycie metod rozszerzeń podobnych do tego, jak się to robi w rzeczywistym źródle ASP.NET. Oto przykład, nazwa funkcji może być dowolna, ale musi być inna niż TextBoxFor, ponieważ ma tę samą listę parametrów.

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" }); 
    } 
} 

Użycie będzie podobne do zwykłego MVC uwzględnia tylko przestrzeń nazw metod (y) rozszerzeń.

@using MyProject.Helpers; 

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

Pozdrawiam Daniela - tak, wygląda na to, że zrobię coś w tym stylu. Miałem nadzieję, że nie będę musiał tworzyć zbyt wielu przeciążeń, ale muszę zapewnić taki sam poziom elastyczności, jaki zapewnia obecnie struktura MVC. Będę tworzył pewne metody rozszerzania i łączył klasę z atrybutami html zgodnie z wymaganiami (aby programiści używający mojej frameworka mogli dodawać własne klasy niestandardowe, jeśli będą tego potrzebować) – levelnis

0

można zrobić, jak to

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

lub dla stylu inline

@Ou.TextBoxFor(m => m.Username,new{@style="font-size:10px"}) 
Powiązane problemy