我有以下ActionLink:
@Html.ActionLink("Upload","Upload","File")
但当我将鼠标悬停在链接上时,浏览器中显示的URL为http:// localhost:44334 / 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文件表的每一行中添加了一个下载链接,如下所示:
@Html.ActionLink("Download","Download","File",new { filePath = file.Path })
https://localhost/Download?filePath=....
解决方法
在构建REST API时通常使用Http {Verb}(“{{{{{{{{{{{{{{{{为了能够在使用属性路由时为默认MVC控制器生成URL,您需要使用Route属性.
原始控制器可能没有路由前缀,这意味着
//POST /Upload //<-- when there is no prefix on the controller [HttpPost("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) { //... } }