ASP. NET CORE Маршрутизация со многими параметрами - PullRequest
0 голосов
/ 03 марта 2020

В приложении четыре выпадающих кнопки. Параметры в раскрывающемся списке являются ссылками. Код для одного из них:

<li><a asp-controller="Aircrafts" asp-action="Compare" 
asp-route-vehicle1="@item.Id">@item.Name</a></li>

@item.Id это переменная типа int

Метод контроллера, принимающий значения:

[HttpGet("compare/{vehicle1}/{vehicle2}/{vehicle3}/{vehicle4}")]
public IActionResult Compare(int vehicle1, int vehicle2, int vehicle3, int vehicle4)
{//код} 

Маршрутизация :.

endpoints.MapControllerRoute(
name: "FourParameters",
pattern: "controller=Aircrafts}/{action=Compare}/{vehicle1=0}/{vehicle2=0}/{vehicle3=0}/{vehicle4=0}");

Задача. Когда пользователь нажимает на любую ссылку раскрывающегося списка, например на третью, необходимо, чтобы адрес создавался следующим образом: aircrafts / compare / 0/0/5 / 0
и метод в контроллере вызывается, если он нажимает на четвертый, то адрес должен быть: самолеты / сравнить / 0/0/5/8 и т. Д. c.

но в В моей реализации метод контроллера вызывается только после нажатия на четвертый выпадающий список. Это проблема.

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Если вы хотите сохранить значения параметров, переданные ранее, я предлагаю вам использовать ajax для передачи.

Вот код:

@model IEnumerable<WebApplication_core.Models.Customer>
@{
    ViewData["Title"] = "Compare";
    Layout = null;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<script>
    $(function () {
        var paramObj = {
            "vehicle1": 0,
            "vehicle2": 0,
            "vehicle3": 0,
            "vehicle4": 0,
        }
        $(".dropdown-menu a").click(function () {
            event.preventDefault();
            var url = "/Aircrafts/compare";
            var vehicle = $(this).attr("vehicle");
            var value = $(this).attr("value");
            paramObj[vehicle] = parseInt(value);
            for (var key in paramObj) {
                url += "/" + paramObj[key];
            }
            $.ajax({
                type: "Get",
                url: url,
                success: function (response) {
                    window.history.pushState("", "", url);
                },
                failure: function (response) {
                    alert(response);
                }
            });
        });
    });
</script>
<h1>Compare</h1>
<div class="dropdown">
    <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
        Dropdown1
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu">
        @foreach (var item in Model)
        {
            <li>
                <a asp-controller="Aircrafts" asp-action="Compare"
                   vehicle="vehicle1" value="@item.Id">@item.Name</a>
            </li>
        }
    </ul>
</div>
<br />
<div class="dropdown">
    <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
        Dropdown2
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu">
        @foreach (var item in Model)
        {
            <li>
                <a asp-controller="Aircrafts" asp-action="Compare"
                   vehicle="vehicle2" value="@item.Id">@item.Name</a>
            </li>
        }
    </ul>
</div>
<br />
<div class="dropdown">
    <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
        Dropdown3
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu">
        @foreach (var item in Model)
        {
            <li>
                <a asp-controller="Aircrafts" asp-action="Compare"
                   vehicle="vehicle3" value="@item.Id">@item.Name</a>
            </li>
        }
    </ul>
</div>
<br />
<div class="dropdown">
    <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
        Dropdown4
        <span class="caret"></span>
    </button>
    <ul class="dropdown-menu">
        @foreach (var item in Model)
        {
            <li>
                <a asp-controller="Aircrafts" asp-action="Compare"
                   vehicle="vehicle4" value="@item.Id">@item.Name</a>
            </li>
        }
    </ul>
</div>

Вот результат:

enter image description here

0 голосов
/ 04 марта 2020

Как оказалось, мое решение было хорошим. Просто удалите параметры атрибута:

[HttpGet("compare/{vehicle1}/{vehicle2}/{vehicle3}/{vehicle4}")]

до:

[HttpGet] 

и все работает как положено

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