2011-01-13 58 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