范围属性MVC的验证消息

时间:2016-11-14 15:11:31

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

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

   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>

我需要为long和lat参数添加验证,因为我不希望用户先保存而不选择位置。如此长,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)无效。

3 个答案:

答案 0 :(得分:1)

默认情况下,$.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

答案 1 :(得分:0)

鉴于Lat / Long可以是负数也可以是正数,我会建议填充一个不同的字段来表示已经选择了一个位置:

public float Long { get; set; }
public float Lat{ get; set; }

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

然后用你用来设置Lat&amp; amp;很长,你也可以将LatLongCheck的值设置为1(或其他)。

在链接中使用适用于您的任何技术(根据L-Four的评论)MVC : How to enable client side validation on hidden fields以启用客户端验证。

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

答案 2 :(得分:0)

您可以使用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; }

}