Справка по быстрой проверке C # - PullRequest
0 голосов
/ 14 января 2011

Привет, пожалуйста, посмотрите на этот код:

// if the image url doesn't contain a valid image
            if (!ArticleToCreate.image.Contains(".jpg")
                || !ArticleToCreate.image.Contains(".jpeg")
                || !ArticleToCreate.image.Contains(".png")
                || !ArticleToCreate.image.Contains(".gif")
                || !ArticleToCreate.image.Contains(".bmp"))
            {
                ModelState.AddModelError("Image", "Please enter a valid URL.");
            }

Почему бы это не сработало? План состоит в том, чтобы сказать, что если значение image не имеет одно из этих расширений, то ошибка. Это выглядит хорошо для меня, но не работает. Если у меня есть «MyImage.png», он должен разрешить это, но не «MyImage.hhh», но он ничего не разрешает. Зачем? Спасибо

Ответы [ 4 ]

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

Вы используете условия OR в своем утверждении, поэтому, если какое-либо из них оценивается как true, появится ошибка.

Вы можете изменить его, чтобы он был примерно таким, поскольку вы хотите, чтобы ошибка добавлялась, только если она не содержит ЛЮБЫХ расширений изображения.

// if the image url doesn't contain a valid image
if (!ArticleToCreate.image.Contains(".jpg")
     && !ArticleToCreate.image.Contains(".jpeg")
     && !ArticleToCreate.image.Contains(".png")
     && !ArticleToCreate.image.Contains(".gif")
     && !ArticleToCreate.image.Contains(".bmp"))
{
    ModelState.AddModelError("Image", "Please enter a valid URL.");
}

Теперь есть несколько вещей, которые могут вызвать у вас проблемы, просто чтобы убедиться, что вы осведомлены.

  1. Чувствительность к регистру (.JPG и т. Д.)
  2. Файлы с несколькими расширениями (MyFile.jpg.txt)

Вы можете быть в порядке с тем, что у вас есть, но просто хотите сделать пометку.

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

Это потому, что ваш путь к изображению должен иметь все расширения в соответствии с вашей логикой.измените его на:

if (
            !ArticleToCreate.image.Contains(".jpg") &&
            !ArticleToCreate.image.Contains(".jpeg") &&
            !ArticleToCreate.image.Contains(".png") &&
            !ArticleToCreate.image.Contains(".gif") &&
            !ArticleToCreate.image.Contains(".bmp")
    )
{                 
    ModelState.AddModelError("Image", "Please enter a valid URL.");             
} 

Для наименьшего количества проверок расширений используйте эту версию:

if (
        !(
            ArticleToCreate.image.Contains(".jpg") ||
            ArticleToCreate.image.Contains(".jpeg") ||
            ArticleToCreate.image.Contains(".png") ||
            ArticleToCreate.image.Contains(".gif") ||
            ArticleToCreate.image.Contains(".bmp")
        )
    )
{                 
    ModelState.AddModelError("Image", "Please enter a valid URL.");             
} 
0 голосов
/ 14 января 2011

Чтобы получить расширение, используйте System.IO.Path.GetExtension, например:

string filename ArticleToCreate.image;
string extension = Path.GetExtension(filename)

Затем измените свою логику на что-то более читаемое:

if (!(extension == ".jpg" 
                || extension == ".jpeg"
                || extension == ".png"
                || extension == ".gif"
                || extension == ".bmp"))

Это сработает, если это что-то кроме этих 5 расширений. Другая альтернатива - иметь карту (или массив и использовать linq) расширений. Простой поиск на карте для этого расширения скажет вам, действительно ли это или нет.

string [] extensions = new string [] { ".jpeg", ".png", ".gif", ".bmp", ".jpg" };
string filename ArticleToCreate.image;
string extension = Path.GetExtension(filename)

if( !extensions.ToList().Contains(extension) )  // then handle the invalid extension case
0 голосов
/ 14 января 2011

Помимо того, что сказал Митчел, ваш код не требует, чтобы имя файла заканчивалось на «.jpg», а только на то, что он содержит «.jpg» где-то в строке.Я бы использовал регулярное выражение .+\.jpg$|.+\.jpeg$ ... и сопоставил бы его.

В вашем случае это будет выглядеть так:

if (!Regex.IsMatch(ArticleToCreate.image, @".+\.(jpg|jpeg|bmp|gif|png)$", RegexOptions.IgnoreCase)) {
    ModelState.AddModelError("Image", "Please enter a valid URL.");            
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...