【问题标题】:MVC Url.Content does not resolve file name having special character like # @MVC Url.Content 无法解析具有特殊字符的文件名,例如 # @
【发布时间】:2015-10-07 18:23:16
【问题描述】:

我正在使用带有 Razor 视图引擎的 MVC 5。我想显示名称保存在数据库中的图像。这是我的视图代码:

<img class="article-image" src="@Url.Content(string.Format("~/Images/Upload/{0}/{1}", Model.FolderName, Model.ImageName))" width="100%" />

这可以正常工作,直到我在 Model.ImageName 中有特殊字符,例如“Untitled#@.png”。我在渲染的 html 中有这个:

<img class="article-image" width="100%" src="/Images/Upload/de7b1f47-c9ec-4521-ae8d-faae518e1144/Untitled#@.png">

如果我对文件名使用 URL 编码,图像会正确显示。这是编码版本:

<img class="article-image" width="100%" src="/Images/Upload/de7b1f47-c9ec-4521-ae8d-faae518e1144/Untitled%23%40.png">

我也试过了

<img class="article-image" src="@string.Format("~/Images/Upload/{0}/{1}", Model.FolderName, Model.ImageName)" width="100%" />

没有运气。

我在 MSDN 中发现了有关 UrlHelper.Content 的内容:

如果指定的内容路径不以波浪号 (~) 字符开头,则此方法返回 contentPath 不变。

我只是想知道为什么 UrlHelper.Content 不能解决我的问题?我不想手动编码我的文件名。
对不起我的英语不好。

【问题讨论】:

    标签: html asp.net-mvc razor asp.net-mvc-5


    【解决方案1】:

    Url.Content 仅将提供的相对路径映射到包含虚拟目录的相对绝对路径,并且应用程序可能位于此类路径下。它不会对其提供的相对 URL 进行任何处理,也不会实际加载任何内容或任何东西:它只是返回一个字符串。

    如果FolderNameImageName 可能包含在URL 中无效的字符,那么您只需使用Url.Encode 对其进行编码:

    <img class="article-image" src="@Url.Content(string.Format("~/Images/Upload/{0}/{1}", Url.Encode(Model.FolderName), Url.Encode(Model.ImageName)))" width="100%" />
    

    【讨论】:

    • 这似乎是我的情况的答案,虽然我不想手动做。感谢您的代表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多