传递给控制器​​的参数始终为null

时间:2016-08-17 09:03:48

标签: c# asp.net-mvc asp.net-core

我一直致力于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中做过类似的项目,从来没有遇到过这个框架的问题。

非常感谢任何帮助。谢谢你的时间!

1 个答案:

答案 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>