我看到奇怪的 ActionLink 行为,为什么浏览器中显示的 url 没有显示看似正确的控制器?
I'm seeing strange ActionLink behaviour, why is the url displayed in the browser not displaying the seemingly correct controller?
我有以下 ActionLink
:
@Html.ActionLink("Upload", "Upload", "File")
然而,当我将鼠标悬停在 link 上时,浏览器中显示的 url 是 http://localhost:44334/Upload
。这个 url 中的控制器在哪里?奇怪的是,单击 url 将我带到 File/Upload
视图,但更奇怪的是,浏览器地址栏中显示的 url 是 https://localhost:44334/Upload
.
ActionLink
在页面 Home/Explorer
上,因此据我所知通常需要一个控制器名称。
为什么 ActionLink
助手省略了控制器名称,为什么 link 仍然有效?我已经尝试通过缓存清除来刷新页面,但没有任何区别。我不知道除了保留它还能做什么,因为它有效,但我担心这是一个怪癖,当我部署我的网站时它将不再有效。
我的路由仍然是标准的,开箱即用的,在 Startup
class 的 Configure
方法中:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
奇怪的是,我现在在 HTML table 文件的每一行添加了 Download
link,如下所示:
@Html.ActionLink("Download", "Download", "File", new { filePath = file.Path })
并且这个 link 也没有控制器名称呈现,例如:
https://localhost/Download?filePath=....
这是最奇怪的,但在我的 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。
Http{Verb}("{routeTemplae}")
通常在构建 REST API 时使用。为了能够在使用属性路由时为默认 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) {
//...
}
}
[HttpPost("Upload")]
此处使用 POST 方法,因此在 MVC 控制器上不需要像“/”这样的前缀
[HttpGet("Download")]
public 异步任务下载(字符串文件路径)
我有以下 ActionLink
:
@Html.ActionLink("Upload", "Upload", "File")
然而,当我将鼠标悬停在 link 上时,浏览器中显示的 url 是 http://localhost:44334/Upload
。这个 url 中的控制器在哪里?奇怪的是,单击 url 将我带到 File/Upload
视图,但更奇怪的是,浏览器地址栏中显示的 url 是 https://localhost:44334/Upload
.
ActionLink
在页面 Home/Explorer
上,因此据我所知通常需要一个控制器名称。
为什么 ActionLink
助手省略了控制器名称,为什么 link 仍然有效?我已经尝试通过缓存清除来刷新页面,但没有任何区别。我不知道除了保留它还能做什么,因为它有效,但我担心这是一个怪癖,当我部署我的网站时它将不再有效。
我的路由仍然是标准的,开箱即用的,在 Startup
class 的 Configure
方法中:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
奇怪的是,我现在在 HTML table 文件的每一行添加了 Download
link,如下所示:
@Html.ActionLink("Download", "Download", "File", new { filePath = file.Path })
并且这个 link 也没有控制器名称呈现,例如:
https://localhost/Download?filePath=....
这是最奇怪的,但在我的 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。
Http{Verb}("{routeTemplae}")
通常在构建 REST API 时使用。为了能够在使用属性路由时为默认 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) {
//...
}
}
[HttpPost("Upload")]
此处使用 POST 方法,因此在 MVC 控制器上不需要像“/”这样的前缀
[HttpGet("Download")] public 异步任务下载(字符串文件路径)