ActionLink выдает ошибку HTTP 404.0 — Not Found // 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