您好,请看一下这段代码:
// 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'但它不允许任何东西。为什么?感谢
答案 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 :(得分: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