我需要显示一个文件的链接,但仅在文件存在时才显示。到目前为止,我已尝试扩展UrlHelper,HtmlHelper和MvcHtmlString,但它们似乎都没有给出我需要的结果。
我确定我做错了什么,但我不知道那是什么。 UrlHelper扩展看起来非常接近,但View将链接呈现为文本而不是锚。
public static class UrlHelperExtensions
{
public static string Pdf(this UrlHelper helper, string fileName, string directory)
{
string _fileName = fileName + ".pdf";
string _directory = directory + "/";
string root = "~/Content/Templates/";
string path = HttpContext.Current.Server.MapPath(root + _directory + _fileName);
if (File.Exists(path))
{
return helper.Content("<a href=\"" + root + _directory + _fileName + "\" target=\"_blank\">Download Template</a>");
}
else
{
return "";
}
}
}
然后@Url.Pdf(Model.Item.Number, "Retail")
给我文字
<a href="~/Content/Templates/Retail/1001.pdf" target="_blank">Download Template</a>
在页面上而不是实际链接。
答案 0 :(得分:4)
您必须像HtmlString
这样使用:
public static HtmlString Pdf(this UrlHelper helper, string fileName, string directory)
{
string _fileName = fileName + ".pdf";
string _directory = directory + "/";
string root = "~/Content/Templates/";
string path = HttpContext.Current.Server.MapPath(root + _directory + _fileName);
if (File.Exists(path))
{
return new HtmlString(helper.Content("<a href=\"" + root.Replace("~", "") + _directory + _fileName + "\" target=\"_blank\">Download Template</a>"));
}
else
{
return new HtmlString("");
}
}
编辑:修正了root
字符串。
答案 1 :(得分:1)
这里还有一个解决方案 -
以这种方式扩展您的扩展程序(我略微修改了URL格式,而不是直接链接文件,我将其命名为FileController的DownloadFile Action,目录名称和文件名作为参数)
public static class UrlHelperExtensions
{
public static MvcHtmlString Pdf(this UrlHelper helper, string fileName, string directory)
{
string _fileName = fileName + ".pdf";
string _directory = directory + "/";
string root = "~/Content/";
string path = HttpContext.Current.Server.MapPath(root + _directory + _fileName);
if (File.Exists(path))
{
return new MvcHtmlString("<a href=Downloadfile/" + _directory + fileName + " target=\"_blank\">Download Template</a>");
}
else
{
return new MvcHtmlString(string.Empty);
}
}
}
然后有一条路线 -
routes.MapRoute(
name: "DownloadfileRoute",
url: "{controller}/{action}/{directoryname}/{filename}",
defaults: new { controller = "FileController", action = "DownloadFle" }
);
现在定义了行动 -
public FileResult Downloadfile(string directoryname, string filename)
{
string _fileName = filename + ".pdf";
string _directory = directoryname + "/";
string root = "~/Content/";
string path = Server.MapPath(root + _directory + _fileName);
return new FileContentResult(System.IO.File.ReadAllBytes(path), _fileName);
}
所以现在当你运行视图时,生成的锚标签将是这样的 -
http://localhost:5738/File/Downloadfile/img/untitled
当您点击它时,您的操作将会使用以下值。然后最终文件将被下载。
PS - 确保您的代码中有正确的验证。