2016-08-17 56 views
1

我一直在研究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中完成了类似的项目,从来没有在这个框架中遇到过这个问题。

任何帮助将不胜感激。谢谢你的时间!

回答

2

的关键是在这条线:

<a asp-area="" asp-controller="Node" asp-action="Detail" asp-route-id="@status.Node.Name">@status.Node.DisplayName</a> 

我已经改变了asp-route-idasp-route-name,一切工作正常。所以答案是:

<a asp-area="" asp-controller="Node" asp-action="Detail" asp-route-name="@status.Node.Name">@status.Node.DisplayName</a> 
+0

传说 - 这是诀窍!我从文档中的一个教程中获得了'asp-route-id',但从未意识到它与他们的id参数相匹配,直到您刚刚指出这一点为止。太感谢了! – aevitas

+0

是的,这是非常常见的错误,你总是需要检查参数名称是否在action中,并且'asp-route'或'name'在窗体控件中。我很高兴回答这个问题! –

相关问题