Wersje zapoznawcze Asp.Net MVC 2.0 zapewniają pomocników, takich jak
Html.EditorFor(c => c.propertyname)
Jeśli nazwa właściwości to łańcuch, powyższy kod renderuje pole tekstowe.
Co zrobić, jeśli chcę przekazać właściwości MaxLength i Size do pola tekstowego lub własnej właściwości klasy CSS?
Czy muszę utworzyć jeden szablon dla każdej kombinacji rozmiaru i długości w mojej aplikacji? Jeśli tak, to nie czyni domyślnych szablonów użytecznymi.
c#
asp.net-mvc
asp.net-mvc-2
chandmk
źródło
źródło
Rozwiązałem to, tworząc EditorTemplate o nazwie String.ascx w moim folderze / Views / Shared / EditorTemplates:
Moim zdaniem używam
U mnie działa jak urok!
źródło
Żadna z odpowiedzi w tym lub innym wątku na temat ustawiania atrybutów HTML dla @ Html.EditorFor nie była dla mnie zbyt pomocna. Jednak znalazłem świetną odpowiedź pod adresem
Stylizowanie pomocnika @ Html.EditorFor
Użyłem tego samego podejścia i działało pięknie bez pisania dużej ilości dodatkowego kodu. Zwróć uwagę, że atrybut id wyniku html Html.EditorFor jest ustawiony. Kod widoku
Właściwość modelu z adnotacją do danych i formatowaniem daty jako „dd MMM rrrr”
Działał jak urok bez pisania mnóstwa dodatkowego kodu. Ta odpowiedź używa ASP.NET MVC 3 Razor C #.
źródło
Może chcieć przyjrzeć się postowi na blogu Kirana Chanda , używa on niestandardowych metadanych w modelu widoku, takich jak:
Jest to połączone z niestandardowymi szablonami, które wykorzystują metadane. Moim zdaniem czyste i proste podejście, ale chciałbym zobaczyć ten typowy przypadek użycia wbudowany w mvc.
źródło
EditorFor
, przekazując je jako:new { htmlAttributes: { @class = "yourclass" } }
Dziwię się, że nikt nie wspomniał o przekazaniu go w „additionalViewData” i przeczytaniu po drugiej stronie.
Widok (z podziałami linii, dla większej przejrzystości):
Szablon edytora:
źródło
Problem polega na tym, że twój szablon może zawierać kilka elementów HTML, więc MVC nie będzie wiedział, do którego z nich zastosować twój rozmiar / klasę. Będziesz musiał sam to zdefiniować.
Utwórz szablon jako pochodzenie z własnej klasy o nazwie TextBoxViewModel:
}
W szablonie możesz to zrobić:
Twoim zdaniem robisz:
Pierwsza forma wyrenderuje domyślny szablon dla łańcucha. Drugi formularz wyrenderuje szablon niestandardowy.
Alternatywna składnia używa płynnego interfejsu:
}
Zauważ, że zamiast robić to w widoku, możesz to również zrobić w kontrolerze lub znacznie lepiej w ViewModel:
Zauważ również, że możesz utworzyć podstawową klasę TemplateViewModel - wspólną podstawę dla wszystkich szablonów widoków - która będzie zawierała podstawowe wsparcie dla atrybutów / itp.
Ale ogólnie myślę, że MVC v2 potrzebuje lepszego rozwiązania. To wciąż Beta - idź o to zapytaj ;-)
źródło
Myślę, że najlepszym rozwiązaniem jest użycie CSS. Chciałbym móc zrobić więcej z kodowaniem .NET, jak w XAML, ale CSS w przeglądarce jest królem.
Site.css
.cshtml
Joe
źródło
EditorFor
szablonu. Używam MVC4 i to działało świetnie.Podobnie jak w MVC 5, jeśli chcesz dodać atrybuty, możesz po prostu to zrobić
Informacje znalezione z tego bloga
źródło
Możesz zdefiniować atrybuty dla swoich właściwości.
Jest to znane jako
System.ComponentModel.DataAnnotations
. Jeśli nie możesz znaleźć tegoValidationAttribute
, czego potrzebujesz, zawsze możesz zdefiniować niestandardowe atrybuty.Pozdrawiam, Carlos
źródło
Może to nie jest najlepsze rozwiązanie, ale jest proste. Możesz napisać rozszerzenie do klasy HtmlHelper.EditorFor. W tym rozszerzeniu można podać parametr options, który zapisze opcje do ViewData dla pomocnika. Oto kod:
Po pierwsze, metoda rozszerzenia:
Następnie obiekt opcji:
I na koniec, oto wiersz z szablonu String.ascx:
Szczerze mówiąc, myślę, że jest to proste i jasne dla biednej duszy, która musi przestrzegać twojego kodu w przyszłości. Można go łatwo rozszerzyć o różne inne informacje, które chcesz przekazać do swoich szablonów. Jak dotąd działa dobrze w projekcie, w którym staram się zawrzeć jak najwięcej w zestawie szablonów, aby pomóc ujednolicić otaczający kod HTML, a la http://bradwilson.typepad.com/blog/2009/ 10 / aspnet-mvc-2-templates-part-5-master-page-templates.html .
źródło
Napisałem wpis na blogu, aby odpowiedzieć na własne pytanie
Dodawanie obsługi atrybutów html dla szablonów - ASP.Net MVC 2.0 Beta
źródło
Nie wiem, dlaczego to nie działa w przypadku Html.EditorFor, ale próbowałem TextBoxFor i u mnie zadziałało.
... a także prace walidacyjne.
źródło
@class = "className"
W mojej praktyce stwierdziłem, że najlepiej jest używać EditorTemplates z tylko jednym HtmlHelper w nim - TextBox, czyli w większości przypadków. Jeśli chcę mieć szablon dla bardziej złożonej struktury html, napiszę osobny HtmlHelper.
Biorąc pod uwagę, że możemy wstawić cały obiekt ViewData w miejsce htmlAttributes z TextBox. Ponadto możemy napisać kod dostosowujący dla niektórych właściwości ViewData, jeśli wymagają specjalnego traktowania:
Poniżej znajdują się przykłady składni w widoku i wyjściowy kod HTML:
źródło
Ponieważ pytanie dotyczy sugestii EditorFor not TextBoxFor WEFX, nie działa.
Aby zmienić poszczególne pola wejściowe, możesz przetworzyć dane wyjściowe metody EditorFor:
Możliwa jest również zmiana WSZYSTKICH Twoich EditorFors, jak się okazuje MVC ustawia klasę pól tekstowych EditorFor z .text-box , dlatego możesz po prostu nadpisać ten styl w swoim arkuszu stylów lub na stronie.
Dodatkowo możesz ustawić styl dla
źródło
Miałem również problem z ustawieniem szerokości TextBox w MVC3, podczas gdy ustawienie atrybutu Clsss działało dla kontrolki TextArea, ale nie dla kontrolki TextBoxFor lub EditorFor:
Próbowałem śledzić i to zadziałało dla mnie:
@ Html.TextBoxFor (model => model.Title, new {Class = "textBox", style = "width: 90%;"})
również w tym przypadku Walidacje działają doskonale.
źródło
Jednym ze sposobów obejścia tego problemu jest posiadanie delegatów na modelu widoku do obsługi drukowania specjalnego renderowania, takiego jak ten. Zrobiłem to dla klasy stronicowania, ujawniam publiczną właściwość modelu,
Func<int, string> RenderUrl
aby sobie z tym poradzić.Zdefiniuj więc, jak zostanie zapisany niestandardowy bit:
Wyświetl widok dla
Paging
klasy:... a dla aktualnego
Paging
widoku:Może to być postrzegane jako zbyt skomplikowane sprawy, ale używam tych pagerów wszędzie i nie mogłem znieść widoku tego samego standardowego kodu, aby je renderować.
źródło
UPDATE: hm, oczywiście to nie zadziała, ponieważ model jest przekazywany przez wartość, więc atrybuty nie są zachowywane; ale zostawiam tę odpowiedź jako pomysł.
Myślę, że innym rozwiązaniem byłoby dodanie własnych pomocników TextBox / etc, które sprawdzą twoje własne atrybuty w modelu.
Ten jest łatwiejszy, ale nie tak wygodny / elastyczny.
źródło
Jest to najczystszy i najbardziej elegancki / prosty sposób na uzyskanie tutaj rozwiązania.
Świetny post na blogu i bez bałaganu w pisaniu niestandardowych metod rozszerzających / pomocniczych, takich jak szalony profesor.
http://geekswithblogs.net/michelotti/archive/2010/02/05/mvc-2-editor-template-with-datetime.aspx
źródło
Bardzo podobała mi się odpowiedź @tjeerdans, która wykorzystuje EditorTemplate o nazwie String.ascx w folderze / Views / Shared / EditorTemplates. Wydaje się, że jest to najprostsza odpowiedź na to pytanie. Jednak chciałem mieć szablon używający składni Razor. Ponadto wydaje się, że MVC3 używa szablonu String jako domyślnego (patrz pytanie StackOverflow „ Szablon wyświetlania mvc dla łańcuchów jest używany dla liczb całkowitych ”), więc musisz ustawić model na obiekt, a nie na łańcuch. Wygląda na to, że mój szablon do tej pory działa:
źródło
Rozwiązałem to !!
W przypadku Razor składnia jest następująca:
@Html.TextAreaFor(m=>m.Address, new { style="Width:174px" })
to dostosowuje szerokość obszaru tekstu do szerokości zdefiniowanej w parametrze style.W przypadku ASPx składnia jest następująca:
<%=Html.TextAreaFor(m => m.Description, new { cols = "20", rows = "15", style="Width:174px" })%>
to załatwi sprawę
źródło