Я вижу странное поведение ActionLink, почему url-адрес, отображаемый в браузере, не отображает кажущийся правильным контроллер?

у меня есть следующие ActionLink:

@Html.ActionLink("Upload", "Upload", "File")

но когда я наведу курсор на ссылку, url-адрес, отображаемый в браузере, будет http://localhost:44334/Upload. Где контроллер в этом url-адресе? Как ни странно, щелчок по url приводит меня к моему File/Upload просмотр, и еще более странно, url, отображаемый в адресной строке браузера, -https://localhost:44334/Upload.

на ActionLink на странице Home/Explorer, поэтому AFAIK имя контроллера обычно необходимо.

почему ActionLink helper оставляя вне имя контроллера, и почему ссылка все еще работает? Я попытался обновить страницу с очисткой кэша, без разницы. Я не знаю, что еще делать, кроме как оставить его в покое, потому что он работает, но я обеспокоен тем, что это какая-то причуда, и она больше не будет работать, когда я разверну свой сайт.

мой маршрут по-прежнему стандартный, из коробки, в Startup класса Configure способ:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

как ни странно, теперь я добавил Download связать каждую строку таблицы HTML файлы, выглядящие так:

@Html.ActionLink("Download", "Download", "File", new { filePath = file.Path })

и эта ссылка также отображается без имени контроллера, e.g:

https://localhost/Download?filePath=....

3 ответов


Http{Verb}("{routeTemplae}") обычно используется при создании REST API. Чтобы иметь возможность генерировать URL-адреса для контроллеров MVC по умолчанию при использовании маршрутизации атрибутов, вам нужно будет использовать .

исходный контроллер, вероятно, не имел префикса маршрута, что означало, что

//POST /Upload //<-- when there is no prefix on the controller
[HttpPost("Upload")]

на контроллер маршруту /Upload без префикса контроллер.

включив префикс для маршрута на контроллере, он будет включать контроллер имя при создании URL-адресов при использовании маршрутизации атрибутов.

[Route("[controller]"]
public class FileController : Controller {
    //POST File/Upload
    [HttpPost]
    [Route("Upload")]
    public async Task<ActionResult> Upload(UploadFilesViewModel model, IEnumerable<IFormFile> files) {
        //...
    }

    //GET File/Download
    [HttpGet]
    [Route("Download")]
    public async Task<IActionResult> Download(string filePath) {
        //...
    }
}

ссылка маршрутизация в ASP.NET ядро

ссылка маршрутизация к действиям контроллера


это самое странное, но по-моему FileController, У меня была оставшаяся маршрутизация атрибутов, когда я использовал контроллер для веб-API вместо веб-приложения MVC. Методы по существу выглядели так:

[HttpPost("Upload")]
public async Task<ActionResult> Upload(UploadFilesViewModel model, IEnumerable<IFormFile> files)

[HttpGet("Download")]
public async Task<IActionResult> Download(string filePath)

теперь, когда я удалил имена маршрутов из атрибутов и просто[HttpPost] и [HttpGet], actionlinks работают правильно и отображают URL-адреса, которые теперь содержат имя контроллера.


[HttpPost ("Загрузить")]

здесь используется метод POST, поэтому нет необходимости в префиксе типа'/ ' на контроллере MVC

[HttpGet("Скачать")] публичная асинхронная загрузка задачи (string filePath)