范围属性 MVC 的验证消息

本文关键字:验证 消息 MVC 属性 范围 | 更新日期: 2023-09-27 18:17:54

以下模型具有某些参数的必需属性:

   public class EModel
    {        
        [Required]
        [Display(Name = "Name")]
        public string Name { get; set; }
        [Required]
        [Display(Name = "Tel")]
        public string Phone { get; set; }
        public float Long { get; set; }
        public float Lat{ get; set; }
    }

在我的视图中,我有姓名、电话和 2 个浮点参数:我保存在隐藏输入中的经度和纬度,它们由地图标记设置,以便稍后保存。

我正在验证所需的参数,如下所示:

<div>
    @Html.EditorFor(model => model.Name, new { htmlAttributes = new { placeholder = "Name" } })
    @Html.ValidationMessageFor(model => model.Name, "", new { @class = "danger" })
</div>
<div>
    @Html.EditorFor(model => model.Phone, new { htmlAttributes = new { placeholder = "Phone" } })
    @Html.ValidationMessageFor(model => model.Phone, "", new { @class = "danger" })
</div>
<div>
    @Html.HiddenFor(x => x.Long, new { @id = "Long"})
    @Html.HiddenFor(x => x.Lat, new { @id = "Lat"})
</div>
<div>
    <button type="submit">Save</button>
</div>

我需要为长整型和 lat 参数添加验证,因为我不希望用户在没有先选择位置的情况下保存。 这么长,纬度不应该小于 0.001,所以我添加了以下属性:

[Range(0.001, float.MaxValue)]
public float Long { get; set; }
[Range(0.001, float.MaxValue)]
public float Lat{ get; set; }

我想在提交点击时验证,Long 和 Lat 都不是 0.00

我该怎么做? @Html.ValidationMessageFor(x=>x.Long)没有用。

范围属性 MVC 的验证消息

默认情况下,$.validator不验证隐藏的输入。可以通过添加以下脚本来覆盖此行为

$.validator.setDefaults({ 
    ignore: [] 
});

或者,如果您只想验证这两个隐藏输入并忽略其他隐藏输入,请为它们指定一个类名(例如new { @class = "coordinates" } (并使用

$.validator.setDefaults({ 
    ignore: ':hidden:not('.coordinates')'
});

另一种方法是将值生成为只读文本框,这也将向用户提供额外的反馈

@Html.TextBoxFor(x => x.Long, new { @readonly = "readonly"})

请注意,没有必要使用 new { @id = "Long"}) - 生成表单控件的HtmlHelper方法已经基于属性的名称添加了 id 属性。

但是,范围验证实际上没有意义,因为零值和负值对坐标有效。如果要确保用户已选择位置(并且已通过脚本设置值(,请使属性nullable并添加RequiredAttribute

[Required(ErrorMessage = "Please select a location")]
public float? Long { get; set; } // nullable

鉴于纬度/经度可以是负数,也可以是正数,我建议填充一个不同的字段以指示已选择位置:

public float Long { get; set; }
public float Lat{ get; set; }
[MinValue(1, "Please select a location")
public int LatLongCheck { get; set; }

然后,在用于设置 Lat & Long 的任何代码中,您还可以将 LatLongCheck 的值设置为 1(或其他任何值(。

在链接中使用任何适合您的技术(根据L-Four的评论( MVC :如何在隐藏字段上启用客户端验证以启用客户端验证。

您还可以查看万无一失的验证,它具有[NotEqualTo]验证属性,您可以使用该属性代替替代字段。最后,您可以考虑将 Lat/Long 值显示为 readonly 字段,默认情况下会对其进行验证。

您可以使用 CSS 隐藏经纬度输入

<div style="visibility: hidden;">
    @Html.EditorFor(model => model.Long, new { @id = "Long"})
    @Html.EditorFor(model => model.Lat, new { @id = "Lat"})
</div>
<div>
    @Html.ValidationMessageFor(model => model.Long)
    @Html.ValidationMessageFor(model => model.Lat)
</div>

<小时 />并根据模型的要求进行设置

public class EModel
{        
    [Required]
    [Range(0.001, float.MaxValue)]
    [Display(Name = "Long")]
    public string Long { get; set; }
    [Required]
    [Range(0.001, float.MaxValue)]
    [Display(Name = "Lat")]
    public string Lat { get; set; }
}