未触发MVC操作方法

时间:2018-08-29 11:02:48

标签: asp.net-mvc-5 routing

我有一个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}");
}

创建了所有其他路线来处理过滤和导航系统,效果很好。

编辑: 我注释掉了除默认路由以外的所有路由,并且它可行。我的自定义路线有什么问题?

感谢您的帮助。

谢谢, 戴维德。

1 个答案:

答案 0 :(得分:0)

添加路由的顺序很重要。路由引擎将采用与提供的URL匹配的第一条路由,并尝试使用该路由中的路由值。尝试用“属性路由”注释操作方法,如果可行,那么大多数情况下应该与路由顺序保持一致。