【问题标题】:Integer property without Required property is still required没有Required属性的整数属性仍然是必需的
【发布时间】:2016-01-05 13:15:56
【问题描述】:

我没有对整数属性应用任何 [必需] 属性验证。但每次我发布表单时,它都会触发验证。最初它在客户端使用 HTML 5 数据属性。我在 Web.config 中将 ClientValidationEnabled 设置为 false。之后,它会触发必需的属性验证。 我创建了一个新项目,但情况相同。试图将 .Net 框架从 4.6 更改为 4.5,但没有成功。还尝试过 VS2015 和 VS 2013 客户端剃须刀代码

@using (Html.BeginForm("Index", "Home", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.LabelFor(model => model.Weight)
    @Html.TextBoxFor(model => model.Weight, new { @class = "form-control", @placeholder = "Weight", Value = "" })
    @Html.ValidationMessageFor(model => model.Weight, "", new { @class = "text-danger" })

    <input type="submit" class="btn btn-default" value="Save" />
}

型号:

    public class RegistrationModel
    {
        public int Weight { get; set; }
    }

动作方法

    public ActionResult Index()
        {
            var model = new RegistrationModel();
            return View(model);
        }

        [HttpPost]
        public ActionResult Index(RegistrationModel model)
        {
            if (ModelState.IsValid)
            {

            }

            return View();
        }

谢谢

【问题讨论】:

  • 尽可能显示model 代码以及模型和视图中的所有其他属性?
  • 您不需要将[Required] 属性应用于int 的属性 - 默认情况下需要它(它必须有一个值)。如果您为Weight 发布包null(空字符串)值,那么您将始终收到验证错误。如果您希望它可以为空,则需要将其设为 public int? Weight { get; set; }
  • 并且在使用 html 帮助程序时永远不要尝试设置 value 属性(就像您使用 new { Value = "" } 所做的那样)
  • 显示您的模型代码和操作方法
  • @Hiba 我刚刚编辑了我的问题。但斯蒂芬·穆克的评论是正确的。这是整数类型属性的默认行为。

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


【解决方案1】:

您的模型属性是 typeof int。 int 必须始终有一个值(它不能为空),因此无论禁用客户端验证,只要您点击控制器,如果您为 @ 提交 null(空字符串)值,ModelState 将无效987654325@.

如果你想允许空值,那么你必须使属性可以为空

public int? Weight { get; set; }

附注:当您使用 html 帮助程序绑定到模型属性时,切勿尝试设置 value 属性。

【讨论】:

  • 对不起,我不确定这里的 MODEL 是否显示验证所需的任何数据注释。你能解释一下吗?
  • @stephen 如果主键中的属性如何?它不能为空
  • @Hiba,没有 PK 字段不能为空,因此您不会为 PK 属性执行此操作(您也不想 - 如果恶意用户尝试为 PK 发布 null 值属性,您希望 ModelState 无效)
  • 它有时会发生 int 属性是 PK 并且它发生在添加新属性的情况下。所以我推荐 ModelState.Remove("Weight");但你的答案也是正确的
  • @Hiba,你不应该使用像ModelState.Remove()这样的黑客如果它是一个PK,那么属性将为int(不可为空),如果它是一个新对象,默认值为0 (并且它永远不会在视图中编辑。无论如何,如果您创建一个新对象,您应该使用一个视图模型,如果 PK 则它甚至没有属性,因此它永远不会无效。
【解决方案2】:

这是整数类型属性的默认行为,因为 int 必须 值甚至为零。因此,您必须在模型中将其设为可为空的 int 类型。

【讨论】:

    【解决方案3】:

    这可能对你有帮助,

    <form method="post" action="/foo" novalidate>...</form>
    

    或

    <form>
        <input type="email"/> <!-- Will be validated -->
        <input type="string" formnovalidate/> <!-- Will not be validated -->
    </form>
    

    【讨论】:

    • 在您的情况下,我们通过了验证。但在某些情况下,也许我需要验证:)
    • 这样您就可以明确限制对特定控件的验证,如第二种情况中所述,即
    猜你喜欢
    • 2014-11-18
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多