Как перейти с вопросительного знака (?) На sla sh (/) на URL MVC Route? - PullRequest
0 голосов
/ 16 марта 2020

В настоящее время у меня есть файл PDF, который правильно отображается на странице, но URL-адрес отображается как "/Test?id=name.pdf", и я хочу, чтобы он отображался как "/Test/name.pdf". Как мне этого добиться?

Вот мой код:

.cs html

<a class="dropdown-item" href="@Url.Action("Trees", "Park", new { id = "name.pdf" })" target="_blank">Text</a>

Контроллер

public ActionResult Trees(string id)
{
    string path = Server.MapPath(String.Format("~/folder1/folder2/{0}", id));

    string mime = MimeMapping.GetMimeMapping(path);

    return File(path, mime);
}

RouteConfig.cs

    routes.MapRoute(
        name: "testing",
        url: "Test/{filename}",
        defaults: new { controller = "Park", action = "Trees", filename  = UrlParameter.Optional }
    );

Есть идеи, что я делаю не так? Я уже проверил эти похожие вопросы ASP. NET MVC Вопрос маршрутизации Как избавиться от знака вопроса на маршруте ASP. NET MVC? но ни одно из этих решений не помогло мне, возможно, это связано с тем, что у меня есть @ Url.Action с новым {id = "name.pdf"}, и это может быть разницей, поскольку ни один из этих вопросов не имел этого.

Любые предложения приветствуются. Благодаря.

Ответы [ 2 ]

4 голосов
/ 16 марта 2020

Ваш параметр URL-адреса маршрута Test/{filename}, следовательно, filename должен заменить параметр id в вашем cs html и контроллере.

РЕДАКТИРОВАТЬ: вам нужно добавить маршрут выше маршрута по умолчанию и добавить параметр для модуля webconfig. Нам также нужно отредактировать webconfig, потому что по умолчанию они не поддерживают символ ..

EDIT 2: Не забудьте добавить каталог или файл в решение Visual Studio.

routeconfig.cs: добавить маршрут до маршрута по умолчанию.

public static void RegisterRoutes(RouteCollection routes)
{
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

   routes.MapRoute(
      name: "testing",
      url: "Test/{filename}",
      defaults: new { controller = "Park", action = "Trees", filename = UrlParameter.Optional }
   );

   routes.MapRoute(
      name: "Default",
      url: "{controller}/{action}/{id}",
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
   );
}

webconfig: добавить параметр runAllManagedModulesForAllRequests="true" в узел модулей.

<system.webserver>
   <modules runAllManagedModulesForAllRequests="true">
      ...
   </modules>
</system.webserver>

cs html:

<a class="dropdown-item" href="@Url.Action("Trees", "Park", new { @filename = "name.pdf" })" target="_blank">Text</a>

контроллер:

public ActionResult Trees(string filename)
{
    string path = Server.MapPath(String.Format("~/folder1/folder2/{0}", filename));

    string mime = MimeMapping.GetMimeMapping(path);

    return File(path, mime);
}
0 голосов
/ 17 марта 2020

Я наконец-то нашел решение!

Итак, все сводилось к двум вещам: устранение id = UrlParameter.Optional в RouteConfig.cs, которое вызывает знак вопроса (?), И понимание того, что вы, очевидно, не можете поставить точка (.) внутри скобок {}, потому что если вы попытаетесь это сделать, то скобки {} не примут ввод и, следовательно, путь будет неправильным.

Итак, вот как код выглядит обновленным:

.cs html

//Took out .pdf so that the brackets on the controller can read the input
<a class="dropdown-item" href="@Url.Action("Trees", "Park", new { filename = "name" })" target="_blank">Text</a>

Контроллер:

public ActionResult Trees(string filename)
{
    //Added .pdf after the {}, ideally this wouldn't be hard coded but that's out of
    //the scope of this question/problem
    string path = Server.MapPath(String.Format("~/folder1/folder2/{0}.pdf", filename));

    string mime = MimeMapping.GetMimeMapping(path);

    return File(path, mime);
}

RouteConfig.cs:

    routes.MapRoute(
        name: "testing",
        url: "Test/{filename}",
        defaults: new { controller = "Park", action = "Trees"}
        //Remove the URLParameter.Optional
    );

Этот результат в открытии PDF успешно И URL должен быть Test / name с sla sh (/), а не с вопросительным знаком (?). Единственное, что нужно исправить, - это чтобы в URL также отображалось расширение (.pdf), но это уже другой вопрос в другой ветке. Но для замены знака вопроса (?) На косую черту (/) И успешного открытия PDF-файла это решение достигается и отвечает на мой оригинальный вопрос.

...