C#的快速验证帮助

时间:2011-01-13 22:13:04

标签: c# asp.net-mvc validation

您好,请看一下这段代码:

// 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.");
            }

为什么这不起作用?计划基本上是说图像的值是否没有其中一个扩展然后出错。它看起来不错,但不起作用。如果我有'MyImage.png'它应该允许它但不允许'MyImage.hhh'但它不允许任何东西。为什么?感谢

4 个答案:

答案 0 :(得分:2)

您在语句中使用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)
  3. 你可能对你所拥有的东西感到满意,但只是想记下来。

答案 1 :(得分:1)

这是因为您的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.");             
} 

要使用此版本进行最少数量的扩展程序检查:

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.");             
} 

答案 2 :(得分:0)

除了Mitchel所说的,你的代码并不强制文件名以“.jpg”结尾,而只是在字符串中的某处包含“.jpg”。我会使用正则表达式.+\.jpg$|.+\.jpeg$ ...并匹配它。

在您的情况下,这看起来像:

if (!Regex.IsMatch(ArticleToCreate.image, @".+\.(jpg|jpeg|bmp|gif|png)$", RegexOptions.IgnoreCase)) {
    ModelState.AddModelError("Image", "Please enter a valid URL.");            
}

答案 3 :(得分:0)

要获得扩展,请使用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
相关问题