【问题标题】:Argument passed to controller is always null传递给控制器​​的参数始终为空
【发布时间】:2016-08-17 09:03:48
【问题描述】:

我一直在 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”作为 NodeControllerDetail 操作的参数,但它确实拒绝这样做。 name 这里始终为空。

我还弄乱了Startup.Configure 中的路由,将以下路由添加到控制器:

routes.MapRoute(
    name: "Node Detail",
    template: "{controller=Node}/{action=Detail}/{name}");

但不幸的是,无济于事。每次我调用操作时,无论是通过单击上面列出的链接,还是通过在浏览器中输入 URL 手动访问详细操作,ASP.NET Core 都会输出以下日志行:

Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: 执行动作方法 Aegis.Controllers.NodeController.Detail (Aegis) 带参数 () - ModelState 有效

我在这里不知所措 - 我是否遗漏了一些非常明显的东西,或者 ASP.NET Core 是否不适用于原始类型,我是否应该求助于我在指南中看到的“模型绑定”(像这样简单的动作似乎有点矫枉过正)?

我见过与此类似的各种其他问题,但没有一个是针对 ASP.NET Core 的。我在经典的 ASP.NET 中做过类似的项目,但该框架从未遇到过这个问题。

任何帮助将不胜感激。感谢您的宝贵时间!

【问题讨论】:

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


    【解决方案1】:

    关键在这一行:

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

    【讨论】:

    • 传奇 - 成功了!我从文档中的一个教程中获得了asp-route-id,但直到您刚刚指出这一点,我才意识到它与他们的 id 参数匹配。谢谢一百万!
    • 是的,这是很常见的错误,你总是需要检查参数名称是否在行动和asp-routename在表单控件中。很高兴回答这个问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2019-02-04
    相关资源
    最近更新 更多