2016-08-17 3 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> 

Для одного из моих узлов, это приводит к следующей ссылке:

http://example.com/Node/Detail/Temeria

И от того, что я понимаю из ASP.NET Ядра документацию, контроллер должен захватить «Temeria» здесь как аргумент для действия DetailNodeController, но он надежно отказывается это делать. 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 и никогда не имел этой проблемы с этой структурой.

Любая помощь была бы принята с благодарностью. Спасибо за ваше время!

ответ

2

Ключ находится в этой строке:

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

Легенда - это было трюк! Я получил «asp-route-id» из одного из учебников в документации, но никогда не понимал, что он соответствует их параметру id, пока вы не указали это только сейчас. Бесконечно благодарен! – aevitas

+0

Да, это очень распространенная ошибка, вам всегда нужно проверить, указано ли имя параметра в действии и 'asp-route' или' name' в элементах формы. Мое удовольствие ответить на этот вопрос! –

Смежные вопросы