Мне не удалось найти встроенный атрибут, соответствующий URL-адресу и принять протокол как необязательный.
Поэтому вместо этого я использовал следующий валидатор RegularExpression:
public class MediaModel
{
public long MediaId { get; set; }
[StringLength(60)]
[RegularExpression(@"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)", ErrorMessage = "Not a valid website URL")]
public string Website { get; set; }
[DisplayName("YouTube Video")]
[StringLength(200)]
[RegularExpression(@"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)", ErrorMessage = "Not a valid YouTube video")]
public string YouTubeVideo { get; set; }
}
Я скопировалРегулярное выражение от здесь , оно хорошее.