1

一直把我的头撞到墙上,谷歌试图找到我问题的答案。

当下面的 IF 语句执行时,似乎完全通过 IF 和 ELSE 语句运行。

  if (IsPostBack)
         {
             Boolean bFileOK = false;

             if (fulReagentImg.HasFile)
             {
                 String sFileExtension = System.IO.Path.GetExtension(fulReagentImg.FileName).ToLower();
                 String sFileExtensionLabel = sFileExtension;
                 lblFileExtension.Text = sFileExtensionLabel;
                 String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg" };
                 for (int i = 0; i < allowedExtensions.Length; i++)
                 {
                     if (sFileExtension == allowedExtensions[i])
                     {
                         bFileOK = true;
                     }
                     else
                     {
                         lblException.Text = "Can only upload .gif, .png, .jpeg, .jpg";
                         lblException.CssClass = "red";
                     }

 }

任何想法为什么它没有停止 bFileOK = true?

4

6 回答 6

5

你的循环是完全错误的。
如果用户的扩展名不等于列表中的所有扩展名,则会显示错误。

您应该调用该Contains()方法,最好是HashSet<String>.

于 2012-09-14T20:12:06.350 回答
1

因为您的 sFileExtension 是单个扩展名,而不是所有四个允许的扩展名。这意味着即使 sFileExtension 是允许的扩展之一,它仍然不会是其他三个,所以无论如何,你的 else 语句都会受到影响。

于 2012-09-14T20:13:50.983 回答
1

我认为您希望当 bFileOK =true 时您应该中断;然后使用 break 语句

if (IsPostBack)
    {
        Boolean bFileOK = false;

        if (fulReagentImg.HasFile)
        {
            String sFileExtension = System.IO.Path.GetExtension(fulReagentImg.FileName).ToLower();
            String sFileExtensionLabel = sFileExtension;
            lblFileExtension.Text = sFileExtensionLabel;
            String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg" };
            for (int i = 0; i < allowedExtensions.Length; i++)
            {
                if (sFileExtension == allowedExtensions[i])
                {
                    bFileOK = true;
                    break;
                }
                else
                {
                    lblException.Text = "Can only upload .gif, .png, .jpeg, .jpg";
                    lblException.CssClass = "red";
                }

}
于 2012-09-14T20:15:20.213 回答
0

您不应该在 for 循环中包含 else ,否则您将至少发布失败消息 allowedExtensions.Length-1 次。

将 else 移出 for 循环,并让它跟随:

if(bFileOK)
{
//Do Stuff
}
于 2012-09-14T20:13:51.200 回答
0

是否有可能允许扩展中的第一项成功而第二项失败从而进入标准的第一部分和第二部分?也许你的意思是:

if (IsPostBack)
    {
        Boolean bFileOK = false;

        if (fulReagentImg.HasFile)
        {
            String sFileExtension = System.IO.Path.GetExtension(fulReagentImg.FileName).ToLower();
            String sFileExtensionLabel = sFileExtension;
            lblFileExtension.Text = sFileExtensionLabel;
            String[] allowedExtensions = { ".gif", ".png", ".jpeg", ".jpg" };
            for (int i = 0; i < allowedExtensions.Length; i++)
            {
                if (sFileExtension == allowedExtensions[i])
                {
                    bFileOK = true;
                }
            }
            if (!bFileOK)
            {

                    lblException.Text = "Can only upload .gif, .png, .jpeg, .jpg";
                    lblException.CssClass = "red";

            }
     }
}
于 2012-09-14T20:14:26.597 回答
0

您需要在将 bFileOk 设置为 true 后添加一个 break 语句。当您遍历数组中的每个字符串时,您实际上只测试了最后一个字符串 I 是数组。

我还将调查 Array.Contains 它将提供更清洁的实现。

于 2012-09-14T20:18:49.240 回答