我一直在研究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'在窗體控件中。我很高興回答這個問題! –