Я работал над относительно простым приложением в 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 Ядра документацию, контроллер должен захватить «Temeria» здесь как аргумент для действия Detail
NodeController
, но он надежно отказывается это делать. name
здесь всегда null.
Я также возился с маршрутизацией в 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) с аргументами() - ModelState действителен
Я теряюсь здесь - я отсутствует что-то действительно очевидное здесь, или ASP.NET Core не работает с примитивными типами, и я должен прибегнуть к «привязке модели», которое я видел в руководствах (что, кажется, немного перехитрило для действия, столь же простого, как и это один)?
Я видел различные другие вопросы, подобные этому, но ни один из них не был для ASP.NET Core. Я сделал аналогичные проекты в классическом ASP.NET и никогда не имел этой проблемы с этой структурой.
Любая помощь была бы принята с благодарностью. Спасибо за ваше время!
Легенда - это было трюк! Я получил «asp-route-id» из одного из учебников в документации, но никогда не понимал, что он соответствует их параметру id, пока вы не указали это только сейчас. Бесконечно благодарен! – aevitas
Да, это очень распространенная ошибка, вам всегда нужно проверить, указано ли имя параметра в действии и 'asp-route' или' name' в элементах формы. Мое удовольствие ответить на этот вопрос! –