Я вижу странное поведение 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)