【问题标题】:"Required" validation message remains after removal of [Required] attribute MVC 5删除 [Required] 属性 MVC 5 后,“必需”验证消息仍然存在
【发布时间】:2016-09-06 02:17:45
【问题描述】:

我的视图模型属性之一中有一个[Required] 属性:

[DefaultValue(1)]
[Required(ErrorMessage = "* Required")] // this has now been removed
public int QuoteQuantity { get; set; }

我删除了[Required],但我仍然收到阻止我提交的验证消息。

在视图中我有以下几行:

@Html.EditorFor(model => model.QuoteQuantity, new { htmlAttributes = new { @class = "form-control", value = "1" } })
@Html.ValidationMessageFor(model => model.QuoteQuantity, "", new { @class = "text-danger" })

当我将此留空并提交时,我收到此验证错误:

QuoteQuantity 字段是必需的。

我应该提到我已经反复构建了解决方案,关闭并重新打开了 VS,即使当前代码是这样的,我仍然不断收到此验证错误:

[DefaultValue(1)]
public int QuoteQuantity { get; set; }

知道为什么会发生这种情况吗?

【问题讨论】:

  • 因为QuoteQuantityint,不能为空,所以你的验证还是需要它。我在下面发布了一个答案:)

标签: c# asp.net-mvc validation asp.net-mvc-5


【解决方案1】:

这是因为您的QuoteQuantityint,目前不是Nullable,所以当您尝试验证时,该字段不能为空,因为它不允许nulls。

解决这个问题的两种方法:

  • QuoteQuantity int 设置为int? (Nullable int)

  • 使用不同的属性将值作为string 接受,并在get 中为QuoteQuantity 使用int.TryParse 以查看字符串是否可以转换为int您需要进行某种检查,但要查看它是否在您的最小/最大范围内 - 如果您有的话

示例

第一个建议:

public int? QuoteQuantity { get; set; }

第二个建议:(如果字符串为空/null 或无效int,则返回0

public int QuoteQuantity
{
    get 
    {
        int qty = 0;
        if (!string.IsNullOrWhiteSpace(QuoteQuantityAsString))
        {
            int.TryParse(QuoteQuantityAsString, out qty);
        }
        return qty;
    }
}

public string QuoteQuantityAsString { get; set; }
// You will then need to use the
// QuoteQuantityAsString property in your View, instead

我建议第一个选项,并确保您在使用QuoteQuantity 的位置进行null 检查:)

希望这会有所帮助!

编辑:

为了公平起见,我只是想到了另一种方法(可能比建议 2 更好)。 无论如何,我认为建议 1 仍然是最好的方法。

为了仅在用户确实在视图上的“报价数量”字符串输入中输入内容时返回验证:

查看:

  • 在视图中,添加一个文本输入,允许用户输入数量(或不输入,视情况而定)并使用它来代替您当前的 QuoteQuantity 元素

  • 给它一个id + name 之类的 quoteQty

  • 像以前一样添加 ValidationFor,但将 quoteQty 名称作为第一个参数

控制器:

  • 在您的控制器POST 方法中,接受string quoteQty 的另一个参数(以便此映射与您的视图中的name 相同)。这将从您的 HttpPost 中填充

  • 之前检查您的(ModelState.IsValid),尝试将quoteQty 解析为int;如果没有,请为quoteQty 添加一个ModelError,并带有一条消息

  • 然后,您的模型将返回验证错误并根据需要显示在页面上。

  • 缺点是,这无法在客户端进行验证,因此服务器必须返回错误

像这样:

public ActionResult SendQuote(Model yourmodel,
                              string quoteQty)
{
    if (!string.IsNullOrWhiteSpace(quoteQty))
    {
        if (!int.TryParse(quoteQty, out yourmodel.QuoteQuantity))
        {
            // If the TryParse fails and returns false
            // Add a model error. Element name, then message.
            ModelState.AddModelError("quoteQty",
                                     "Whoops!");
        }
    }
    ...
    // Then do your ModelState.IsValid check and other stuffs
}

并且只使用原始属性

public int QuoteQuantity { get; set; }

在您的模型中。 int 的默认值将是 0,如果您从未设置它。如果TryParse 失败,它也将值设置为0

【讨论】:

    猜你喜欢
    • 2015-11-24
    • 2016-01-05
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多