ASP.NET @ Url.Action不生成下载文件的链接

时间:2014-01-19 09:53:18

标签: asp.net-mvc razor

我有一个博客类型的网站(由3DBuzz视频教程指导),后端(用于管理目的)和前端。在后端和前端,用户都应该能够下载文件。

前端和后端的操作:

public ActionResult Download(string filename)
    {
        var filepath = System.IO.Path.Combine(Server.MapPath("~/Content/Files/"), filename);
        if (!System.IO.File.Exists(filepath))
            return HttpNotFound();

        return File(filepath, MimeMapping.GetMimeMapping(filepath), filename);
    }

前端视图(@ Url.Action在前端和后端都是相同的):

@foreach (var file in Model.Post.Files)
{
<a class="list-group-item file-download" href='@Url.Action("Download", "Posts", new { filename = file.FileName } )' id="@file.FileName">
        <span class="name">@file.FileName</span>
</a>
 }

我没有为此操作配置任何路由。 问题是在后端生成了url,我可以下载文件

<a class="file-link" href="/admin/Posts/Download?filename=putty.exe">putty.exe</a>

但是当我想从前端下载时......没有生成链接:

<a class="list-group-item file-download" id="putty.exe">
                    <span class="name">putty.exe</span>
</a>

如果我在routeConfig中创建路线:

routes.MapRoute("DownloadFile", "downloadFile/{filename}", new { controller = "Posts", action = "Download" }, namespaces);

生成的链接是:

<a class="list-group-item file-download" href="/downloadFile/putty.exe" id="putty.exe">
           <span class="name">putty.exe</span>
</a>

但是当我点击此链接时,我得到了404 Not Found

2 个答案:

答案 0 :(得分:0)

确保以集成模式运行您的网络应用程序,并将以下内容添加到global.asax

routes.RouteExistingFiles = true;

您可能希望通过将以下行添加到global.asax来从路由中排除Content文件夹中的文件:

routes.IgnoreRoute("Content/{*pathInfo}");

答案 1 :(得分:0)

最终弄清楚了,我的路由管理员没有正确配置。