我一直致力于ASP.NET Core中一个相对简单的应用程序,它显示网络中各种节点的状态。它显示了他们的最新状态以及其他一些信息。
为此,我创建了一个控制器,它具有一个采取节点名称的动作,在节点管理器中执行查找,并返回该特定节点的详细视图。此控制器操作的实现方式如下:
public IActionResult Detail(string name)
{
// Maybe redirect this to the node detail overview once it's done?
if (string.IsNullOrEmpty(name))
return View("PageNotFound");
var viewModel =
Current.NodeManager.Statuses.FirstOrDefault(s => s.Node.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
if (viewModel == null)
return View("PageNotFound");
return View(viewModel);
}
我正在从我的概述页面链接到此操作。我用来做这个的HTML是:
<a asp-area="" asp-controller="Node" asp-action="Detail" asp-route-id="@status.Node.Name">@status.Node.DisplayName</a>
对于我的一个节点,这会产生以下链接:
http://example.com/Node/Detail/Temeria
根据我从ASP.NET Core文档中理解的内容,控制器应该在此处捕获“Temeria”作为Detail
NodeController
行为的参数,但它可靠地拒绝这样做。 name
此处始终为空。
我还通过在控制器中添加以下路由来解决Startup.Configure
中的路由问题:
routes.MapRoute(
name: "Node Detail",
template: "{controller=Node}/{action=Detail}/{name}");
但不幸的是,无济于事。每次我调用操作时,无论是通过单击上面列出的链接,还是通过在我的浏览器中键入URL手动访问详细操作,ASP.NET Core都会显示以下日志行:
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:执行操作方法Aegis.Controllers.NodeController.Detail(Aegis)with arguments() - ModelState是有效的
我在这里不知所措 - 我错过了一些非常明显的东西,或者ASP.NET Core无法使用原始类型,我应该采用我在导游中看到的“模型绑定”(其中对于一个像这个一样简单的动作,似乎有点矫枉过正?)
我已经看到了与此类似的各种其他问题,但没有一个是针对ASP.NET Core的。我在经典ASP.NET中做过类似的项目,从来没有遇到过这个框架的问题。
非常感谢任何帮助。谢谢你的时间!
答案 0 :(得分:2)
关键在于这一行:
<a asp-area="" asp-controller="Node" asp-action="Detail" asp-route-id="@status.Node.Name">@status.Node.DisplayName</a>
我已将asp-route-id
更改为asp-route-name
,一切正常。所以答案是:
<a asp-area="" asp-controller="Node" asp-action="Detail" asp-route-name="@status.Node.Name">@status.Node.DisplayName</a>