18

Здесь я пишу этот вопрос, пытаясь найти ответ на два дня.mvc4 url ​​validation

в основном сюда что-то происходит.

У меня есть свойство в 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" }) 

теперь проблема заключается в том, как ввод текста для этого поля проверяется в сторона клиента. поле должно иметь префикс протокола все время, иначе оно становится недействительным.

Каков наилучший способ решить эту проблему?

Many Thanks

ответ

30

Вы можете сделать это с помощью 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; } 
    } 
} 

Для ваших целей, то первый вариант достаточно.

Пакет этой библиотеки (с поддержкой ASP.NET MVC в комплекте) можно найти на NuGet: Install-Package DataAnnotationsExtensions.MVC3

Примечание: это также отлично работает с ASP.NET MVC 4

+2

Привет, спасибо за ваш ответ. Я пытался использовать '[Url (UrlOptions.OptionalProtocol)]'. но для того, чтобы 'UrlOptions' был доступен, я должен добавить' using DataAnnotationsExtensions', тогда 'Url' становится неоднозначным. Чтобы исправить это, я использовал '[DataAnnotationsExtensions.Url (UrlOptions.OptionalProtocol)]', но он не проверяется в интерфейсе. – Amila

+1

Хорошо, пока я не найду, что я делаю неправильно с DataAnnotationsExtensions, я собираюсь объединить ответы. Я захватил регулярное выражение для факультативного протокола из [link] (http://dataannotationsextensions.org/Url/Create) и использовал аннотацию данных регулярного выражения для проверки. теперь он отлично работает. Но я хотел бы использовать другие расширения аннотаций, которые представлены в DataAnnotationExtensions. так что нужно выяснить, что происходит – Amila

+0

@Amila У меня была такая же проблема. Вместо этого я использовал эту регулярную экспрессию. Не все охватывают, но выполняют задание '[RegularExpression («^[(http (s)?): \\/\\/(www \\.)? A-zA-Z0-9 @:% ._ \\ + ~ # =] {2256} \\ [аз] {2,6} \\ Ь. ([- A-Za-Z0-9 @:.?% _ \\ + ~ # & // =] *) $ «)]' – Lsakurifaisu

0

Не уверен, что я полностью понимаю вопрос. Вы пытаетесь проверить правильность формирования URL-адресов? В этом случае вы могли бы реализовать RegularExpression DataAnnotation следующим образом:

[RegularExpression(@"^http(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$", ErrorMessage = "My Error Message")] 
+0

Это не работает. Ни одно из регулярных выражений URL, которые я пробовал при добавлении в качестве аннотации данных MVC, не работает. –

+0

Этот, кажется, работает для меня [RegularExpression («^ [(http (s)?): \\/\\/(www \\.)? A-zA-Z0-9 @:% ._ \\ + ~ # =] {2256} \\ [аз] {2,6} \\ Ь. ([- A-Za-Z0-9 @:.?% _ \\ + ~ # & // =] *) $ ")] – Lsakurifaisu