ASP.NET MVC HTML-методы-помощники для новых типов ввода HTML5
HTML5, похоже, поддерживает новый диапазон полей ввода для вещей, таких как а:
- Числа
- Адреса электронной почты
- Цвет
- URL-адрес
- Числовой диапазон (через слайдер)
- Даты
- Ящики поиска
Кто-нибудь реализовал методы расширения HtmlHelper
для ASP.NET MVC, которые их генерируют? Это можно сделать с помощью перегрузки, которая принимает htmlAttributes
, например:
Html.TextBoxFor(model => model.Foo, new { type="number", min="0", max="100" })
Но это не так приятно (или typeafe) как:
Html.NumericInputFor(model => model.Foo, min:0, max:100)
Ответы
Ответ 1
Просто голова, что многие из них теперь включены в MVC4 с помощью атрибута DataType
.
С этот рабочий элемент вы можете использовать:
public class MyModel
{
// Becomes <input type="number" ... >
public int ID { get; set; }
// Becomes <input type="url" ... >
[DataType(DataType.Url)]
public string WebSite { get; set; }
// Becomes <input type="email" ... >
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
// Becomes <input type="tel" ... >
[DataType(DataType.PhoneNumber)]
public string PhoneNumber { get; set; }
// Becomes <input type="datetime" ... >
[DataType(DataType.DateTime)]
public DateTime DateTime { get; set; }
// Becomes <input type="date" ... >
[DataType(DataType.Date)]
public DateTime Date { get; set; }
// Becomes <input type="time" ... >
[DataType(DataType.Time)]
public DateTime Time { get; set; }
}
Ответ 2
Ознакомьтесь с ASP.NET MVC HTML5 Helpers Toolkit
Ответ 3
Что мне не нравится в атрибутах DataTypes, так это то, что вам нужно использовать EditorFor в представлении. Затем вы не можете использовать htmlAttributes, чтобы украсить ваш тег. Существуют и другие решения, но я предпочитаю этот путь.
В этом примере я только расширил подпись, которую я использую больше всего.
Итак, в классе:
using System.Linq.Expressions;
namespace System.Web.Mvc.Html
{
public static class HtmlExtensions
{
public static MvcHtmlString EmailFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression, Object htmlAttributes)
{
MvcHtmlString emailfor = html.TextBoxFor(expression, htmlAttributes);
return new MvcHtmlString(emailfor.ToHtmlString().Replace("type=\"text\"", "type=\"email\""));
}
}
}
Как вы видите, я просто изменил type = "text" для type = "email", а затем я могу использовать на мой взгляд:
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-lg-2 control-label" })
<div class="col-lg-10">
@Html.EmailFor(m => m.Email, new { @class = "form-control", placeholder = "Email" })
@Html.ValidationMessageFor(m => m.Email)
</div>
</div>
И источник html дает:
<div class="form-group">
<label class="col-lg-2 control-label" for="Email">Email</label>
<div class="col-lg-10">
<input class="form-control" data-val="true" data-val-required="The Email field is required." id="Email" name="Email" placeholder="Email" type="email" value="" />
<span class="field-validation-valid" data-valmsg-for="Email" data-valmsg-replace="true"></span>
</div>
</div>
Ответ 4
Люблю это, когда можно управлять этим типом вещей с модели! Я украсил мои модели [DataType(DataType.PhoneNumber)]
, и все, кроме одного, работали.
Я понял, какой трудный способ @Html.TextBoxFor
не отображает type="<HTML5 type>"
, а @Html.EditorFor
. Кажется, я думаю, теперь, когда я думаю об этом, но публикую это, чтобы, может быть, сохранить других, разочаровывающих несколько минут, которые я только что потерял;)
Ответ 5
Самый простой способ - просто добавить type = "Email" в качестве атрибута html. Он переопределяет тип по умолчанию = "текст". Ниже приведен пример с помощью html5 validator:
@Html.TextBox("txtEmail", "", new { placeholder = "email here", @required = "", @type="email" })
Ответ 6
Я обнаружил, что сам хочу получить числовое число, которое вы получаете при использовании <input type='number' />
из HtmlHelper, и в конечном итоге решил это сам.
Аналогично RPAlbert Html.EmailFor ответ выше, я начал использовать обычный Html.TextBoxFor, но затем я использовал LinqToXml для изменения HTML, а не просто с помощью замены строки.
Преимущество, начинающееся с Html.TextBoxFor, заключается в том, что вы можете использовать все материалы проверки на стороне клиента, которые MVC делает для вас. В этом случае я использую значения из атрибутов data-val-range
для установки атрибутов min/max, необходимых для ограничения счетчика.
public static HtmlString SpinnerFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
{
XDocument _xml = XDocument.Parse(html.TextBoxFor(expression, htmlAttributes).ToString());
XElement _element = _xml.Element("input");
if (_element != null)
{
_element.SetAttributeValue("type", "number");
if (_element.Attribute("data-val-range-max") != null)
_element.SetAttributeValue("max", _element.Attribute("data-val-range-max").Value);
if (_element.Attribute("data-val-range-min") != null)
_element.SetAttributeValue("min", _element.Attribute("data-val-range-min").Value);
}
return new HtmlString(_xml.ToString());
}
Затем вы будете использовать его, как и любой другой HtmlHelper в своих представлениях:
@Html.SpinnerFor(model => model.SomeNumber, new { htmlAttribute1 = "SomeValue" })
Это была моя реализация этого в любом случае, из вашего вопроса я вижу, что вы хотели:
@Html.NumericInputFor(model => model.Foo, min:0, max:100)
Было бы очень просто настроить мой метод, чтобы сделать это следующим образом:
public static HtmlString NumericInputFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, int min, int max)
{
XDocument _xml = XDocument.Parse(html.TextBoxFor(expression, htmlAttributes).ToString());
XElement _element = _xml.Element("input");
if (_element != null)
{
_element.SetAttributeValue("type", "number");
_element.SetAttributeValue("min", min);
_element.SetAttributeValue("max", max);
}
return new HtmlString(_xml.ToString());
}
В основном все, что я сделал, это переименование и предоставление min/max в качестве аргументов, а не получение их из атрибутов DataAnnotation.
Я надеюсь, что это поможет!