2016-11-14 41 views
0

下面的模型已要求某些参数属性:验证消息对于范围属性MVC

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; } 

我想验证上提交点击,事实证明朗和纬度都没有0.00

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

+1

为什么要验证不能是场通过用户输入设置?默认情况下,客户端验证不适用于隐藏字段。虽然 –

+0

@ ste-fu我编辑解释更多,服务器端验证仍然应该工作。浮点值由地图标记设置。我不想让用户先保存而没有先选择位置 – HelpASisterOut

+0

*我不想让用户先保存而没有先选择位置* ..所以你想检查是否有价值?或检查长和经度是<.001? –

回答

1

默认情况下需要,$.validator不验证隐藏的输入。您可以通过添加以下脚本

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

,或者如果你想验证只有这2倍隐藏的投入,而忽略其他隐藏的投入,给这些类名(比如new { @class = "coordinates" })重写此行为,使用

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

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

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

请注意,是不是necess ary使用new { @id = "Long"}) - 生成表单控件的HtmlHelper方法已根据属性的名称添加了id属性。

但是,您的范围验证没有意义,因为零和负值对坐标有效。如果你想确保用户选择的位置(和值已通过你的脚本设置),然后进行性能nullable并添加RequiredAttribute

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

这是一个很好的答案谢谢。但在文档加载现在默认情况下,地图上的标记设置为0 ,0,如果我可以为空,那么地图的坐标将为null,标记将不会被设置,这是一个问题 – HelpASisterOut

+0

因此,您使用相同的属性来设置初始值?(您没有显示任何脚本),你总是可以测试'null',如果是的话,将初始纬度/长度设置为0,0 –

0

由于纬度/长可以为负,以及正,我建议填充不同的字段以表明已选定:

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

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

然后在你使用设置纬度&的任何代码长,你也可以设置LatLongCheck的值为1(或其他)。

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

你也可以看看Foolproof Validation其中有[NotEqualTo]验证属性,您可以使用,而不是替代字段。最后,您可以考虑将纬度/长度值显示为readonly字段,默认情况下会对其进行验证。

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; } 

}