2011-01-13 57 views
0

嗨,请看看下面的代码:快速验证帮助与C#

// 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'但它不允许任何东西。为什么?谢谢

回答

1

这是因为你的图像路径应该有你的逻辑的所有扩展。将其更改为:

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

是啊现在想通了:)谢谢 – Cameron 2011-01-13 22:18:20

+0

增加了一个版本,以减少检查次数。 – Chandu 2011-01-13 22:19:09

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)

你可能会确定你所拥有的东西,但只是想记。

0

除了什么米切尔说,你的代码不执行该文件的名称以“.jpg”结尾,但仅限于它包含字符串中某处的“.jpg”。我会使用正则表达式.+\.jpg$|.+\.jpeg$ ...并匹配它。

在你的情况,这将是这样的:

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

如果它不是这些扩展名,就会触发。另一种方法是使用扩展的映射(或数组并使用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