Я обнаружил, что хочу получить счетчик чисел, который вы получаете при использовании <input type='number' />
из HtmlHelper, и в итоге решил сам.
По аналогии с приведенным выше ответом RPAlbert's 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.
Надеюсь, это поможет!