Справка по проверке ASP.NET MVC - PullRequest
0 голосов
/ 13 января 2011

Я делаю некоторую простую проверку внутри моего контроллера Я знаю, что это лучше поместить в нечто вроде сервисного слоя, но для этого я хочу оставить его внутри контроллера

Идея состоит в том, чтобы проверить, что в поле URL вводится действительный URL, например, для отображения изображения. http://domain.com/myawesomeimage.png будет действительным и http://domain.com/ не будет действительным.

// ValidateInt has a default value of 0
        int ValidateInt = 0;
        // If the url entered (if one at all) does not have correct extension then increment the ValidateInt
        if (!ArticleToEdit.image.Contains(".jpg"))
            ValidateInt++;
        if (!ArticleToEdit.image.Contains(".jpeg"))
            ValidateInt++;
        if (!ArticleToEdit.image.Contains(".png"))
            ValidateInt++;
        if (!ArticleToEdit.image.Contains(".gif"))
            ValidateInt++;
        if (!ArticleToEdit.image.Contains(".bmp"))
            ValidateInt++;
        // if ValidateInt is bigger than 0 then the url is invalid
        if (ValidateInt > 0)
            ModelState.AddModelError("Image", "Please enter a valid URL.");

РЕДАКТИРОВАННЫЙ КОД

Ответы [ 3 ]

2 голосов
/ 13 января 2011

Проблема с вашим кодом

Ваш код недействителен, потому что в состоянии вашей модели всегда будет как минимум 4 ошибки. Даже если URL будет правильным. Ваш код требует, чтобы ваш URL имел все расширения , что, конечно, неверно. Это может быть только один. Максимум.

Решение

Вместо этого используйте DataAnnotations и используйте валидатор регулярных выражений. Вы, очевидно, уже используете некоторый класс модели приложения под названием ArticleToCreate. Вам нужно будет поместить атрибут аннотации данных в свойство image (еще одно замечание: ключевые имена свойств с регистром Pascal, таким же, как .net):

public class ArticleToCreate
{
    [RegularExpression(@"...")] // add regular expression that fulfils your requirements
    public string Image { get; set; }
    ...
}

Тогда все зависит от сложности вашего регулярного выражения. Самым простым для ваших нужд может быть только то, что он начинается с http:// и заканчивается правильным расширением:

^http:\/\/.+\.(?:png|jpe?g|gif|bmp)$

И если вы напрямую предоставляете свой экземпляр класса для действия контроллера, он будет автоматически проверен для вас без какого-либо дополнительного кода. Таким образом, вы не сможете забыть для проверки ваших объектов вручную.

Рассмотрим это действие контроллера, которое автоматически проверяет ваш экземпляр объекта класса модели с помощью определенных для него валидаторов (согласно описанию валидатора, которое я написал выше):

public ActionResult Create(ArticleToCreate data)
{
    if (!this.ModelState.IsValid)
    {
        // handle invalid object
    }
    // handle valid object
}

Таким образом, ваши действия будут сосредоточены на части обработки, которая является их главной целью, вместо того, чтобы фокусироваться на слишком многих аспектах вашего бизнес-процесса, таких как проверка, например.

Более короткий код = более простой код = легче поддерживать = меньше ошибок = меньше работы = счастливые клиенты

1 голос
/ 13 января 2011

Почему бы не создать пользовательские ValidationAttribute s (из DataAnnotations) и позволить механизму валидации выполнять всю работу за вас, а не беспокоиться о том, куда поместить вашу логику?

Полагаю, это будет выглядеть примерно так:

[AttributeUsage(AttributeTargets.Property | 
    AttributeTargets.Field, AllowMultiple = false)]
public class ValidImageUrlAttribute : ValidationAttribute
{
    public string ErrorMessage { get; set; }

    public override bool IsValid(object value)
    {
        var url = value as string;
        if(!url.Contains(".jpg") || !url.Contains(".jpeg")
           || !url.Contains(".gif") || !url.Contains(".bmp")
           || !url.Contains(".png"))
        {
            return false;
        }

        return true;               
    }

    public override string FormatErrorMessage(string name)
    {
        return ErrorMessage ?? base.FormatErrorMessage(name);
    }
}

И тогда вы можете украсить свою модель:

[Required(ErrorMessage = "Image URL is required.")]
[ValidImageUrl(ErrorMessage = "Valid Image URL is required.")]
public string ImageUrl { get; set; }
0 голосов
/ 13 января 2011

изменено if (validate1 > 0) и работает нормально :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...