我有以下ActionLink
:
@Html.ActionLink("Upload", "Upload", "File")
但当我将鼠标悬停在链接上时,浏览器中显示的网址为http://localhost:44334/Upload
。这个网址中的控制器在哪里?奇怪的是,点击该网址会将我带到我的File/Upload
视图,但更奇怪的是,浏览器地址栏中显示的网址为https://localhost:44334/Upload
。
ActionLink
位于Home/Explorer
页面上,因此通常需要AFAIK作为控制器名称。
为什么ActionLink
助手会忽略控制器名称,为什么链接仍然有效?我尝试使用缓存清除刷新页面,没有区别。我不知道还有什么可以做,因为它可以工作,但我担心这是一些怪癖,当我部署我的网站时它将不再有效。
我的路由仍然是Startup
类Configure
方法中标准的,开箱即用的:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
奇怪的是,我现在已经在HTML文件表的每一行添加了一个Download
链接,如下所示:
@Html.ActionLink("Download", "Download", "File", new { filePath = file.Path })
此链接也会在没有控制器名称的情况下呈现,例如:
https://localhost/Download?filePath=....
答案 0 :(得分:5)
Http{Verb}("{routeTemplae}")
。为了能够在使用属性路由时为默认MVC控制器生成URL,您需要使用Route
属性。
原始控制器可能没有路由前缀,这意味着
//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) {
//...
}
}
答案 1 :(得分:3)
这是最奇怪的,但在我的FileController
中,我从使用控制器进行Web API而不是MVC Web应用程序时,我有了剩余的属性路由。这些方法基本上是这样的:
[HttpPost("Upload")]
public async Task<ActionResult> Upload(UploadFilesViewModel model, IEnumerable<IFormFile> files)
[HttpGet("Download")]
public async Task<IActionResult> Download(string filePath)
既然我已经从属性中删除了路由名称,并且只有普通[HttpPost]
和[HttpGet]
,则动作链接正常工作并呈现现在包含控制器名称的URL。
答案 2 :(得分:0)
[HttpPost( “上传”)]
这里使用POST方法,因此在MVC控制器上不需要像“ / ”这样的前缀
[HTTPGET( “下载”)] public async Task Download(string filePath)