【问题标题】:How to do Integer model validation in asp.net mvc 2如何在 asp.net mvc 2 中进行整数模型验证
【发布时间】:2011-04-02 16:12:18
【问题描述】:

我有一个注册表单,用户必须输入他们房子的面积。我希望这个值只是一个整数。有没有办法使用属性 asp.net mvc 来验证这个值?

【问题讨论】:

标签: c# asp.net-mvc int model-validation


【解决方案1】:

意识到这已经得到了回答,但 Stefanvds 的回答过于复杂。只需使用内置验证属性的 MVC:

[DisplayName("Square Feet")]
[Required(ErrorMessage = "Square Feet is Required")]
[Range(0, int.MaxValue, ErrorMessage = "Square Feet must be a positive number")]
public int SquareFeet { get; set; }

【讨论】:

  • 对于 Range,系统有一个错误消息“XXX 字段必须介于 XXX 和 XXX 之间。”所以 ErrorMessage 是可选的
  • 是的,你是对的。但是自定义的 ErrorMessage 比:“字段 Square Feet 必须介于 0 和 2147483647 之间”更加用户友好。 ;)
  • 至少在 MVC2 中,如果传入的数据不是有效的整数,这将不起作用。框架将传入默认值 0 并且验证将成功,但稍后当框架实际实例化模型并看到它无法将数据转换为整数时失败。它会在此时显示默认错误消息。
【解决方案2】:

是的,是的,但是您必须制作要创建的对象的平面版本,因为属性验证仅在 MVC 将您的数据转换为模型之后运行。当您的值为 int 时,将无法验证用户是否输入了 int,并且您将收到 MVC 错误消息而不是您的错误消息。

您可以发布您想要制作的对象吗?

对于平面版本,我的意思是所有日期时间和整数都是平面版本中的字符串。

然后我用这个:

    [DisplayName("Square meters")]
    [PosNumberNoZero(ErrorMessage = "need a positive number, bigger than 0")]
    public string squaremeters { get; set; }

在同一个文件中

public class PosNumberNoZeroAttribute : ValidationAttribute {
    public override bool IsValid(object value) {
        if (value == null) {
            return true;
        }
        int getal;
        if (int.TryParse(value.ToString(), out getal)) {

            if (getal == 0)
                return false;

            if (getal > 0)
                return true;
        }
        return false;

    }
}

如果我的模型状态有效,我使用 AutoMapper 将我的 FlatModel 转换为我的模型,这只是 2 行代码。

编辑:如果 0 是有效数字:

public class PosNumberAttribute : ValidationAttribute {
    public override bool IsValid(object value) {
        if (value == null) {
            return true;
        }
        int getal;
        if (int.TryParse(value.ToString(), out getal)) {

            if (getal >= 0)
                return true;
        }
        return false;
    }
}

【讨论】:

  • 对不起。我应该知道的麻烦。刚刚放了个脑袋
  • 为什么不使用 decimal.TryParse 什么的?这样,您可以支持更多的数字类型,而不仅仅是整数
【解决方案3】:

我通常这样使用范围属性:

正整数:

[Range(0,int.MaxValue)]
public int Id { get; set; }

负整数:

[Range(int.MinValue,-1)]
public int Id { get; set; }

任何整数:

[Range(int.MinValue,int.MaxValue)]
public int Id { get; set; }

【讨论】:

  • 零 - 不是正整数。
【解决方案4】:

如果你有一些像“a”这样的字母,那么使用Range 作为int 字段将不起作用。
未调用错误 Handler (ASP.NET CORE 1.0 RC2)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多