我一直在研究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>
对于我的节点之一,这将产生以下链接:从ASP.NET核心
http://example.com/Node/Detail/Temeria
而且从我个人理解文件,控制器应在这里捕获“Temeria”作为动作NodeController
的参数,但它可靠地拒绝这样做。 name
这里始终为空。
我也与路由混乱周围Startup.Configure
,通过添加下面的路线控制器:
routes.MapRoute(
name: "Node Detail",
template: "{controller=Node}/{action=Detail}/{name}");
但不幸的是,无济于事。每次我调用该动作时,无论是通过单击上面列出的链接,还是通过在浏览器中输入网址手动访问详细操作,ASP.NET Core都会吐出以下日志行:
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:信息:正在执行的操作方法Aegis.Controllers.NodeController.Detail(宙斯盾)与参数() - ModelState中是有效的
我在这里损失 - 是我在这里丢失了一些非常明显的东西,或者ASP.NET Core不能用于原始类型,并且我应该使用我在指南中看到的“模型绑定”(这对于一个操作来说似乎有点矫枉过正)是一)?
我见过类似这个问题的其他各种问题,但没有一个是针对ASP.NET Core的。我在传统的ASP.NET中完成了类似的项目,从来没有在这个框架中遇到过这个问题。
任何帮助将不胜感激。谢谢你的时间!
传说 - 这是诀窍!我从文档中的一个教程中获得了'asp-route-id',但从未意识到它与他们的id参数相匹配,直到您刚刚指出这一点为止。太感谢了! – aevitas
是的,这是非常常见的错误,你总是需要检查参数名称是否在action中,并且'asp-route'或'name'在窗体控件中。我很高兴回答这个问题! –