ActionLink извежда HTTP 404.0 – грешка „Не е намерено“ // ASP.NET MVC

Имам проблем с предаването на името на щракнатия ActionLink към контролера и използването му. При щракване се появява грешка 404. Това е част от моя изглед, наречен Scan.cshtml

<tbody >
                @foreach (string item in ViewBag.files)
                {
                    <tr>
                        <td class=" row col-md-12 "> @Html.ActionLink(item, "Download", "Scan", new { id = item }, new { style = "color: #424242" })</td>
                    </tr>
                }
            </tbody>

Това е частта от ScanController, където се опитвам да работя с изпратени данни. Мисля, че изобщо не стига до логиката на контролера и извежда грешка по-рано.

    public ActionResult Download(string id)
    {
        // controller logic for downloading file
        var ftpko = new MyProject.Helpers.ftp(@path, name, passwd);
        ftpko.download(id, "~/Dotazniky/dotaznik.jpg"); 

        return View();
    }

Да кажем, че item = "car.jpg", грешката казва искания път - http://localhost:53593/Scan/Download/car.jpg не е намерен.

Това е файлът RouteConfig:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

person sustekj    schedule 12.04.2015    source източник


Отговори (1)


Проблемът е, че завършвате името на URL адреса си с .jpg и заявката ще търси файл със съдържание, а не да изпълни действие.

Има начини да деактивирате това, но мисля, че най-лесното решение е да изпратите name и extension в отделни параметри.

Действието става:

public ActionResult Download(string name, string ext)
{ 
     string id = name + "." + ext;

Добавете нов маршрут

routes.MapRoute(
        name: "TwoParameters",
        url: "{controller}/{action}/{name}/{ext}",
        defaults: new { controller = "Home", action = "Index"}
    );

Променете ActionLink

@{ var params = item.Split('.'); }
@Html.ActionLink(item, "Download", "Scan", new { name = params[0], ext = params[1] }, new { style = "color: #424242" })

Бележки: Има други начини (различни от .Split('.')) за вземане на разширение и име на файл.

person adricadar    schedule 12.04.2015
comment
Благодаря ви за супер бързия отговор. Ти си прав. Наистина това беше проблемът. Надявам се, че това ще помогне на други със същия проблем в бъдеще. - person sustekj; 12.04.2015