Метод действия MVC не сработал - PullRequest
0 голосов
/ 29 августа 2018

У меня есть веб-приложение MVC5 со списком предметов и кнопкой доставки для каждого из них.

@foreach (var i in Model.Inventario)
{
    @using (Html.BeginForm("AggiungiAlloScarico", "Scarico"))
    {
        string Disabilitato = "";
        string Classe = "";
        // some method to define the buttons' styles

        <div class="pull-right">
            @Html.Hidden("Modello", i.Item.Modello)
            @Html.Hidden("returnUrl", Request.Url.PathAndQuery)
            <input type="submit" class="@(String.Format("{0}", Classe))" value="Consegna" @Disabilitato />
        </div>
    }
}

При нажатии любой из этих кнопок должен быть запущен метод действия AggiungiAlloScarico в контроллере Scarico. Этот метод просто добавляет выбранный элемент к объекту в сеансе, а затем перенаправляет пользователя в представление Index в том же контроллере, что-то вроде страницы «корзины», где они могут позже выбрать подтверждение или возврат к исходной странице.

[HttpPost]
public RedirectToRouteResult AggiungiAlloScarico(string Modello, string returnUrl)
{
    InventoryItem item = itemRepository.Inventario.FirstOrDefault(i => i.Item.Modello == Modello).Item;

    if (item != null)
    {
        GetScarico().AddItem(item, 1);
    }

    return RedirectToAction("Index", new { returnUrl });
}

Проблема в том, что этот метод действия вообще не запускается. Я подумал, что может быть что-то не так с маршрутизацией, потому что каждый раз, когда я нажимаю кнопку «Consegna», я перенаправляюсь на страницу localhost:port/Scarico/AggiungiAlloScarico: эта конструкция URL соответствует карте маршрутизации по умолчанию (последний метод в классе RoutConfig) , но соответствующее действие не вызывается. Более того, я ставлю точку останова на методе, но он никогда не останавливается на достигнутом, поэтому я полагаю, что здесь кроется проблема, но я действительно не вижу ее.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        null,
        "",
        new { controller = "magazzino", action = "inventario", manufacturer = (string)null, page = 1 }
    );

    routes.MapRoute(
        null,
        "Page{page}",
        new { controller = "magazzino", action = "inventario", manufacturer = (string)null },
        new { page = @"\d+" }
    );

    routes.MapRoute(
        null,
        "{manufacturer}",
        new { controller = "magazzino", action = "inventario", page = 1 }
    );

    routes.MapRoute(
        null,
        "{modello}",
        new { controller = "magazzino", action = "inventario", manufacturer = (string)null, page = 1 }
    );

    routes.MapRoute(
        null,
        "{manufacturer}/Page{page}",
        new { controller = "magazzino", action = "inventario" },
        new { page = @"\d+" }
    );

    routes.MapRoute(
        null,
        "{manufacturer}/{modello}",
        new { controller = "magazzino", action = "inventario", page = 1 }
    );

    routes.MapRoute(null, "{controller}/{action}");
}

Все остальные маршруты были созданы для работы с системой фильтрации и навигации, которая работает хорошо.

EDIT: Я закомментировал все маршруты, кроме стандартных, и это работает. Что не так с моими настроенными маршрутами?

Любая помощь приветствуется.

Спасибо, Давида.

1 Ответ

0 голосов
/ 30 августа 2018

Порядок, в котором добавляются маршруты, имеет значение. Механизм маршрутизации возьмет первый маршрут, который соответствует предоставленному URL, и попытается использовать значения маршрута в этом маршруте. Попробуйте аннотировать метод действия с помощью Attribute Routing, если это работает, то в основном это должно быть с порядком маршрутов.

...