Mvc Route 404 при передаче в id через URL - PullRequest
0 голосов
/ 25 января 2019

позвольте мне начать с объяснения того, что я пытаюсь сделать.У меня есть форма с раскрывающимся списком, где при изменении значения вызывает текст метки для изменения.Чтобы сделать это, я прикрепил событие сценария onchange к выключению.

 <select onchange="ChangeLabel()" id="ContainerValue" asp-for="Container" class="form-control"/>

Метка

<label id="AddressLabel" asp-for="Container" class="control-label"/>

Сценарий, который он вызывает,

 <script>
    function ChangeLabel() {
        var val = $('#ContainerValue').val();
        $.ajax({
            url: '/Rundown/GetLabel/' + val ,
            type: "GET",
            dataType: "text",
            success: function (labelText) {
                $("#AddressLabel").html(labelText);
            }
        });
    }
</script>

Поэтому я создаюдействие в моем контроллере под названием GetLabel с идентификатором параметра.

[HttpGet]
// GET: Rundown/GetLabel/5
public string GetLabel(int id)
{
    return "x";
}

Так что я почти уверен, что использую маршрутизацию по умолчанию, которая создается при настройке проекта.Насколько я знаю, я не связывался с этим.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();

    app.UseAuthentication();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Теперь, когда я изменяю выбор в раскрывающемся списке, запрос на изменение срабатывает, и делается запрос на /Rundown/GetLabel/1, но он возвращаетошибка 404.Просто для целей тестирования я заметил, что если бы я выполнил /Rundown/GetLabel/?id=1, я бы нажал на свое действие GetLabel и вернул бы мое "x" строковое значение.Любая идея, почему я не вижу, как мое действие получает нормальную [controller]/[action]/[id] маршрутизацию, которую я ожидал бы сработать?

Единственная другая связанная с этим информация, о которой я могу думать, - это маршрут в приборе над классом контроллера.

[Route("[controller]/[action]")]
public class RundownController : Controller

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы используете GET, поэтому вам нужно изменить атрибут маршрута как ->

[HttpGet]
[Route("RunDown/GetLabel/{id}")]
public string GetLabel(int id)
{
  return "x";
}

Вам нужно написать этот метод действия над вами. Надеюсь, это поможет

0 голосов
/ 25 января 2019

Вы смешиваете атрибуты и основанные на соглашении маршруты, которые вызывают конфликт.

Атрибут route будет иметь приоритет над маршрутом на основе соглашения, и поскольку у вас нет шаблона маршрута для параметра действия, он не найден.

Добавить шаблон маршрута для действия

Route("[controller]/[action]")]
public class RundownController : Controller {

    // GET: Rundown/GetLabel/5
    [HttpGet("{id}")]        
    public string GetLabel(int id) {
        return "x";
    }

}

Наличие атрибута route на контроллере и просто HttpGet на действии означало, что URL выглядел бы как

Rundown/GetLabel?id=5

Включив параметр шаблона маршрута [HttpGet("{id}")], вы получите желаемое поведение.

Альтернативой является удаление Route("[controller]/[action]")] из верхней части контроллера и разрешение определения маршрутизации по умолчанию из запуска MapRoute

Ссылка Маршрутизация к действиям контроллера в ASP.NET Core

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...