だるろぐ

明日できることは、今日しない。

URLとして使えない文字が含まれているのを検出する

[Url]という属性を作成。 \"'|*`^><)(}{][#%;/?:@&=+$,. が含まれていたら IsValid() => false を返す。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public sealed class UrlAttribute
    : ValidationAttribute, IClientValidatable
{
    public UrlAttribute()
    {
        ErrorMessage = "URLに利用できない文字が含まれています。";
    }
    
    private readonly char[] INVALID_CHARS =
        "\\\"'|*`^><)(}{][#%;/?:@&=+$,.".ToCharArray();
    
    public IEnumerable<ModelClientValidationRule>
        GetClientValidationRules(
        ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ValidationType = "url",
            ErrorMessage = FormatErrorMessage(
               metadata.GetDisplayName()),
        };
    
        yield return rule;
    }
    
    public override bool IsValid(object value)
    {
        if (value == null || value.GetType() != typeof(string))
        {
            return true;
        }
    
        return !(INVALID_CHARS.Any(
            c => ((string)value).Contains(c)));
    }
}

モデル側で適当なメンバーに[Url]を付与する。

public class Post
{
    [Required]
    public int PostId { get; set; }

    [Required]
    [Url]
    [DisplayName("タイトル")]
    public string Title { get; set; }
    :
    :

f:id:daruyanagi:20120121203055p:plain