Próbuję dodać klasę do wejścia.
To nie działa:
@Html.EditorFor(x => x.Created, new { @class = "date" })
asp.net-mvc
asp.net-mvc-3
razor
user137348
źródło
źródło
Odpowiedzi:
Dodanie klasy do
Html.EditorFor
nie ma sensu, ponieważ wewnątrz jej szablonu możesz mieć wiele różnych tagów. Musisz więc przypisać klasę w szablonie edytora:aw szablonie niestandardowym:
<div> @Html.TextBoxForModel(x => x.Created, new { @class = "date" }) </div>
źródło
Począwszy od ASP.NET MVC 5.1, dodanie klasy do an
EditorFor
jest możliwe (pierwotne pytanie określało ASP.NET MVC 3, a zaakceptowana odpowiedź jest nadal najlepsza z rozważanym).@Html.EditorFor(x=> x.MyProperty, new { htmlAttributes = new { @class = "MyCssClass" } })
Zobacz: Co nowego w ASP.NET MVC 5.1, obsługa Bootstrap dla szablonów edytorów
źródło
Nie możesz ustawić klasy dla ogólnego EditorFor. Jeśli znasz żądany edytor, możesz go od razu użyć, tam możesz ustawić klasę. Nie musisz tworzyć żadnych niestandardowych szablonów.
@Html.TextBoxFor(x => x.Created, new { @class = "date" })
źródło
Możesz użyć:
@Html.EditorFor(x => x.Created, new { htmlAttributes = new { @class = "date" } })
(Przynajmniej z ASP.NET MVC 5, ale nie wiem, jak to było z ASP.NET MVC 3).
źródło
Miałem ten sam frustrujący problem i nie chciałem tworzyć EditorTemplate, który byłby stosowany do wszystkich wartości DateTime (w moim interfejsie użytkownika były chwile, w których chciałem wyświetlić czas, a nie kalendarz rozwijany interfejsu jQuery ). Podczas moich badań główne problemy, które napotkałem, to:
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
, ale nie pozwoliłoby mi to zastosować niestandardowej klasy „date-picker”.Dlatego utworzyłem niestandardową klasę HtmlHelper, która ma następujące zalety:
Ta metoda zastępuje ją pustym ciągiem.
public static MvcHtmlString CalenderTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null) { var mvcHtmlString = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, htmlAttributes ?? new { @class = "text-box single-line date-picker" }); var xDoc = XDocument.Parse(mvcHtmlString.ToHtmlString()); var xElement = xDoc.Element("input"); if (xElement != null) { var valueAttribute = xElement.Attribute("value"); if (valueAttribute != null) { valueAttribute.Value = DateTime.Parse(valueAttribute.Value).ToShortDateString(); if (valueAttribute.Value == "1/1/0001") valueAttribute.Value = string.Empty; } } return new MvcHtmlString(xDoc.ToString()); }
A dla tych, którzy chcą poznać składnię JQuery, która szuka obiektów z
date-picker
dekoracją klasy, aby następnie renderować kalendarz, oto jest:$(document).ready(function () { $('.date-picker').datepicker({ inline: true, maxDate: 0, changeMonth: true, changeYear: true }); $('.date-picker').datepicker('option', 'showAnim', 'slideDown'); });
źródło
DateTimePickerFor
i aktualizując pole daty modelu, które reprezentujesz,[DataType(DataType.Date)]
lub[DataType(DataType.DateTime)]
? Możesz również umieścić go w, powiedzmy, mm / dd / rrrr za pomocą.ParseFormats(new string[] { "MM/dd/yyyy" })
(lub łatwo zmodyfikować go do dowolnego). Jeśli jest null, pole renderuje się jako puste bez konieczności kodowania tego w.@MyHtmlHelpers.CalenderTextBoxFor(model => model.ExpirationDate)
. Jakieś pomysły, jak to wdrożyć?Możliwe jest dostarczenie klasy lub innych informacji poprzez AdditionalViewData - używam tego, gdy pozwalam użytkownikowi stworzyć formularz oparty na polach bazy danych (propertyName, editorType i editorClass).
Na podstawie pierwszego przykładu:
@Html.EditorFor(x => x.Created, new { cssClass = "date" })
aw szablonie niestandardowym:
<div> @Html.TextBoxFor(x => x.Created, new { @class = ViewData["cssClass"] }) </div>
źródło
Nie ma żadnego
EditorFor
nadpisania, które pozwoliłoby na przekazanie anonimowego obiektu, którego właściwości zostałyby w jakiś sposób dodane jako atrybuty do jakiegoś znacznika, szczególnie w przypadku wbudowanych szablonów edytora. Musisz napisać własny niestandardowy szablon edytora i przekazać żądaną wartość jako dodatkowe dane widoku.źródło
nie zezwala na przekazywanie żadnych argumentów do pola tekstowego
W ten sposób możesz zastosować atrybuty.
@Html.TextBoxFor(m=>m.Created, new { @class= "date", Name ="myName", id="myId" })
źródło
Korzystając z jQuery, możesz to łatwo zrobić:
$("input").addClass("class-name")
Oto Twój tag wejściowy
W przypadku DropDownlist możesz użyć tego:
$("select").addClass("class-name")
Lista rozwijana:
źródło
Chociaż pytanie było skierowane do MVC 3.0, okazuje się, że problem występuje również w MVC 4.0. MVC 5.0 zawiera teraz natywnie przeciążenie dla htmlAttributes.
Jestem zmuszony korzystać z MVC 4.0 w moim obecnym miejscu pracy i muszę dodać klasę css do integracji JQuery. Rozwiązałem ten problem za pomocą metody pojedynczego rozszerzenia ...
Metoda rozszerzenia:
using System.Linq; using System.Web.Mvc; using System.Web.Routing; using System.Xml.Linq; namespace MyTest.Utilities { public static class MVCHelperExtensionMethods { public static MvcHtmlString AddHtmlAttributes(this MvcHtmlString input, object htmlAttributes) { // WE WANT TO INJECT INTO AN EXISTING ELEMENT. IF THE ATTRIBUTE ALREADY EXISTS, ADD TO IT, OTHERWISE // CREATE THE ATTRIBUTE WITH DATA VALUES. // USE XML PARSER TO PARSE HTML ELEMENT var xdoc = XDocument.Parse(input.ToHtmlString()); var rootElement = (from e in xdoc.Elements() select e).FirstOrDefault(); // IF WE CANNOT PARSE THE INPUT USING XDocument THEN RETURN THE ORIGINAL UNMODIFIED. if (rootElement == null) { return input; } // USE RouteValueDictionary TO PARSE THE NEW HTML ATTRIBUTES var routeValueDictionary = new RouteValueDictionary(htmlAttributes); foreach (var routeValue in routeValueDictionary) { var attribute = rootElement.Attribute(routeValue.Key); if (attribute == null) { attribute = new XAttribute(name: routeValue.Key, value: routeValue.Value); rootElement.Add(attribute); } else { attribute.Value = string.Format("{0} {1}", attribute.Value, routeValue.Value).Trim(); } } var elementString = rootElement.ToString(); var response = new MvcHtmlString(elementString); return response; } } }
Wykorzystanie znaczników HTML:
@Html.EditorFor(expression: x => x.MyTestProperty).AddHtmlAttributes(new { @class = "form-control" })
(Upewnij się, że w widoku maszynki do golenia uwzględniono przestrzeń nazw metody rozszerzenia)
Objaśnienie: Pomysł polega na wstrzyknięciu do istniejącego kodu HTML. Zdecydowałem się przeanalizować bieżący element za pomocą Linq-to-XML przy użyciu
XDocument.Parse()
. Jako typ przekazuję htmlAttributesobject
. Używam MVCRouteValueDictionary
do analizowania htmlAttributes przekazanych. Scalam atrybuty tam, gdzie już istnieją, lub dodaję nowy atrybut, jeśli jeszcze nie istnieje.W przypadku, gdy dane wejściowe nie są analizowalne
XDocument.Parse()
, porzucam wszelką nadzieję i zwracam oryginalny ciąg wejściowy.Teraz mogę korzystać z zalet DisplayFor (odpowiednio renderować typy danych, takie jak waluta), ale mam również możliwość określenia klas css (i wszelkich innych atrybutów w tym zakresie). Może być pomocny przy dodawaniu atrybutów, takich jak
data-*
, lubng-*
(Angular).źródło
Możesz stworzyć to samo zachowanie, tworząc prosty edytor niestandardowy o nazwie DateTime.cshtml, zapisując go w Views / Shared / EditorTemplates
@model DateTime @{ var css = ViewData["class"] ?? ""; @Html.TextBox("", (Model != DateTime.MinValue? Model.ToString("dd/MM/yyyy") : string.Empty), new { @class = "calendar medium " + css}); }
i w swoich poglądach
@Html.EditorFor(model => model.StartDate, new { @class = "required" })
Zauważ, że w moim przykładzie na stałe koduję dwie klasy css i format daty. Możesz to oczywiście zmienić. Możesz również zrobić to samo z innymi atrybutami HTML, takimi jak tylko do odczytu, wyłączone itp.
źródło
Użyłem innego rozwiązania wykorzystującego selektory atrybutów CSS, aby uzyskać to, czego potrzebujesz.
Wskaż atrybut HTML, który znasz i umieść w odpowiednim stylu względnym.
Jak poniżej:
input[type="date"] { width: 150px; }
źródło
Nie ma potrzeby tworzenia własnego szablonu dla MVC 4. Użyj TextBox zamiast Edit , ponieważ tutaj specjalne atrybuty html nie są obsługiwane, jest obsługiwany tylko z MVC 5. TextBox powinien obsługiwać MVC 4, nie wiem o innej wersji.
@Html.TextBox("test", "", new { @id = "signupform", @class = "form-control", @role = "form",@placeholder="Name" })
źródło
Możesz to również zrobić za pomocą jQuery:
$('#x_Created').addClass(date);
źródło
Musiałem tylko ustawić rozmiar jednego pola tekstowego na jednej stronie. Kodowanie atrybutów w modelu i tworzenie niestandardowych szablonów edytorów było przesadą, więc po prostu opakowałem wywołanie @ Html.EditorFor tagiem span, który wywołał klasę, która określa rozmiar pola tekstowego.
Deklaracja klasy CSS:
.SpaceAvailableSearch input { width:25px; }
Wyświetl kod:
<span class="SpaceAvailableSearch">@Html.EditorFor(model => model.SearchForm.SpaceAvailable)</span>
źródło
Jednym z najlepszych sposobów zastosowania klasy
@Html.EditorFor()
w MVC3 RAzor jest@Html.EditorFor(x => x.Created) <style type="text/css"> #Created { background: #EEE linear-gradient(#EEE,#EEE); border: 1px solid #adadad; width:90%; } </style>
Doda powyższy styl do twojego
EditorFor()
Działa z MVC3.
źródło