如何防止非数字输入上/下控制?

时间:2014-01-16 14:54:30

标签: asp.net-mvc html5 validation data-annotations

编辑我正在尝试让内置的“编辑器”助手正常工作。我不想重新实现这些帮助程序(或者它们“免费”提供的客户端验证)。我正在寻找一种解决方案,理想情况下,我可以通过添加一些额外的数据注释,甚至升级一些标准库来实现我想要的目标。

假设我有一个带整数字段的实体,如下所示:

class Foo
{
    // ...
    public int Price { get; set; }
    // ...
}

现在假设在网络表单中,我使用EditorFor(m => m.Price)。在当前版本的MVC中,这将呈现<input type="number"> HTML标记,在现代浏览器上将显示向上/向下控件。好到目前为止。

但是,如果用户在控件中输入“x”并单击“提交”,则显示的错误消息似乎错误:“价格字段是必需的。”

注意:如果字段可以为空,则情况会更糟 - 在这种情况下,它会默默地丢弃“x”并将字段视为空。育!

如果我尝试使用[RegularExpression]属性阻止无效数字,除非该字段已包含有效数字(!),否则它似乎不会测试正则表达式。

我的正则表达式为^\d*\.?\d*$,不允许使用减号。 “x”没有显示错误,但“-1”显示错误。

有没有办法改善这种情况(特别是在可空字段的情况下)?

2 个答案:

答案 0 :(得分:0)

在我的控制器中,我使用此

[...]
if (string.IsNullOrEmpty(model.Price))
{
     ModelState.AddModelError("Error", "Insert a value");
     return View(model);
}
if (Regex.Matches(model.Price , @"^[a-zA-Z]+$").Count > 0)
{
     ModelState.AddModelError("Error", "Non numeric value");
     return View(model);
}
[...]

或者您可以选择不可为空的选项

[Required]

在你的模型中,然后在正则表达式之前加上一个if

if(!ModelState.isValid){ [...] }

答案 1 :(得分:0)

一种可能性是在视图中为按下或键入的键添加一个JavaScript事件监听器,并将其绑定到编辑器元素。

然后,您可以使用该事件侦听器来丢弃或撤消非数字或相关字符(如“ - ”,“。”)的键击。或','取决于您的本地化。你甚至可以加入一点逻辑,这样它只允许' - ',如果它是第一个字符。