如果文件存在于asp.net mvc中,则返回链接

时间:2014-02-10 14:59:33

标签: c# asp.net-mvc

我需要显示一个文件的链接,但仅在文件存在时才显示。到目前为止,我已尝试扩展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>

在页面上而不是实际链接。

2 个答案:

答案 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

当您点击它时,您的操作将会使用以下值。然后最终文件将被下载。

enter image description here

PS - 确保您的代码中有正确的验证。