我在试图找到两天的答案后,在这里写这个问题。
基本上就是这里发生了什么。
我在viewmodel中有一个属性,如下所示
[Required(ErrorMessage = "Required Field")]
[Url(ErrorMessage="Please enter a valid url")]
[DisplayName("Website")]
public string web { get; set; }
在视图中,我有这个
@Html.EditorFor(model => model.web, new { AutoCompleteType = "Disabled", autocomplete = "off" })
现在的问题在于如何在客户端验证此字段的输入文本。该字段必须始终具有协议前缀,否则将变为无效。
解决此问题的最佳方法是什么?
非常感谢
答案 0 :(得分:34)
您可以使用DataAnnotationsExtensions library执行此操作。它们具有UrlAttribute
,您可以将其配置为仅在指定协议时进行验证。此属性还提供客户端验证。您可以在此处查看此行为的示例:http://dataannotationsextensions.org/Url/Create
您可以按如下方式使用此属性:
using System.ComponentModel.DataAnnotations;
namespace DataAnnotationsExtensions.Core
{
public class UrlEntity
{
[Url]
[Required]
public string Url { get; set; }
[Url(UrlOptions.OptionalProtocol)]
[Required]
public string UrlWithoutProtocolRequired { get; set; }
[Url(UrlOptions.DisallowProtocol)]
[Required]
public string UrlDisallowProtocol { get; set; }
}
}
出于您的目的,第一个选项就足够了。
可以在NuGet上找到此库的包(包含ASP.NET MVC支持): Install-Package DataAnnotationsExtensions.MVC3
注意:这也适用于ASP.NET MVC 4
答案 1 :(得分:0)
不确定我是否完全理解这个问题。您是否尝试验证正确形成的网址?如果是这样,您可以按如下方式实现RegularExpression DataAnnotation:
[RegularExpression(@"^http(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$", ErrorMessage = "My Error Message")]