2016-08-17 50 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'在窗體控件中。我很高興回答這個問題! –

相關問題