我发现我自己想要<input type='number' />
从 HtmlHelper 使用时获得的数字微调器,最终我自己解决了它。
与上面 RPAlbert 的 Html.EmailFor 答案类似,我开始使用普通的 Html.TextBoxFor,但后来我使用 LinqToXml 来修改 HTML,而不仅仅是使用字符串替换。
从 Html.TextBoxFor 开始的优点是您可以使用 MVC 为您执行的所有客户端验证内容。在这种情况下,我使用data-val-range
属性中的值来设置约束微调器所需的最小/最大属性。
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 属性中获取它们。
我希望这会有所帮助!