ASP. NET MVC5 Маршрутизация атрибутов - исключение неоднозначного действия только с одним совпадающим действием - PullRequest
0 голосов
/ 07 января 2020

У меня есть странная ошибка, которая продолжает появляться, обычно во время отладки, где я получу один маршрут, выбрасывающий это исключение из ниоткуда, и продолжу для этого маршрута, пока я не остановлю отладку. Странно то, что у меня есть только одно действие, которое когда-либо будет совпадать, и только одно действие с таким именем, только контроллер и т. Д. c.

Мой вопрос: кто-нибудь сталкивался с таким странным поведением? Какие-нибудь исправления? Это сохраняется после восстановления установки Visual Studio 2019, перезагрузок и т. Д. c. Я думаю, что это проблема с проектом, но я не могу найти ничего с поиском Google, и я понятия не имею, где даже начать искать. Нет никакого способа сопоставления с запасным маршрутом в RouteConfig.cs И атрибутом route, верно?

Обновление: произошло даже после следующих предложений по очистке подобных маршрутов в routeconfig.cs, происходящих на отдельном контроллере (еще один атрибут маршрутизируемого контроллера). Подробности добавлены ниже.

Текущий запрос неоднозначен между следующими методами действия:

System.Web. Mvc .ActionResult Getquestions (System.String, System.String, System.Web. Mvc .FormCollection) для типа> Origin2.Controllers.Events2.Events2APIController

System.Web. Mvc .ActionResult Getquestions (System.String, System.String, System.Web. Mvc .FormCollection) on type> Origin2.Controllers.Events2.Events2APIController

Урезанный контроллер:

using ...


namespace Origin2.Controllers.Events2
{

    [RoutePrefix("app/api/Events")]


    public class Events2APIController : Controller
    {

        [Route("{code}/questions/GET")]
        [HttpPost]
        public ActionResult Getquestions(string code, string mode, FormCollection collection)
        {
            //CODE LIVES HERE. 
        }

        protected override void OnException(ExceptionContext filterContext)
        {
            ExceptionNotifications.SendNotice(filterContext, null, "Events2 API Controller");
        }


    }

}

Урезанный routeconfig.cs

using Origin2.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace Origin2
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapMvcAttributeRoutes(); //Attribute Routing Enabled


            //External
            routes.MapRoute(
                name: "External",
                url: "app/external/{id}",
                defaults: new { controller = "External", action = "Index", id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "app",
                url: "app/{action}/{*id}",
                defaults: new { controller = "app", action = "Index", id = UrlParameter.Optional }
            );

            routes.MapRoute(
                name: "app2",
                url: "app/{action}",
                defaults: new { controller = "app", action = "Index" }
            );

            routes.MapRoute(
                name: "DefaultApp",
                url: "app/{controller}/{action}/{**id}",
                defaults: new { controller = "app", action = "Index", id = UrlParameter.Optional }
            );
            routes.MapRoute(
                name: "DefaultApp2",
                url: "app/{controller}/{action}",
                defaults: new { controller = "app", action = "Index" }
            );
            routes.MapRoute(
                name: "DebugShorthand",
                url: "debug",
                defaults: new { controller = "app", action = "Debug" }
            );
            routes.MapRoute(
                name: "RootAddress",
                url: "",
                defaults: new { controller = "app", action = "Index" }
            );
            routes.MapRoute(
                name: "DefaultOrigin1",
                url: "app/{*url}",
                defaults: new { controller = "app", action = "SendToOrigin1" }
            );
        }
    }
}

После исправления routeconfig. Неоднозначный маршрут cs.

Текущий запрос неоднозначен между следующими методами действия:

System.Web. Mvc .ActionResult EventLanding (System.String) для типа Origin2.Controllers .Events2.Events2Controller

System.Web. Mvc .ActionResult EventLanding (System.String) для типа Origin2.Controllers.Events2.Events2Controller

Урезанные события2Контроллер: * 1 031 *

using Origin2.Models;
using Origin2.Models.Events2;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using static Origin2.Models.Events2.EventRoles;

namespace Origin2.Controllers.Events2
{
   [RoutePrefix("app/Events")]
   [Route("{action=index}")] 

  public class Events2Controller : Controller
    {

        [Route("{code}")]
        public ActionResult EventLanding(string code)
        {
            //This will be the public facing thank you handler for all signup activities. 
            if (code.ToUpper() == "AAABD") 
            {
                return View("EventLandingCustom_AAABD");
            }
            return View();
        }

        protected override void OnException(ExceptionContext filterContext)
        {
            ExceptionNotifications.SendNotice(filterContext, null, "Events2 Controller");

            // Redirect on error:
            //filterContext.Result = RedirectToAction("Error", "Index");
        }
   }
}

1 Ответ

0 голосов
/ 13 января 2020

Я думаю, что эти два маршрута идентичны

routes.MapRoute(
            name: "DefaultApp",
            url: "app/{controller}/{action}/{**id}",
            defaults: new { controller = "app", action = "Index", id = UrlParameter.Optional }
        );
        routes.MapRoute(
            name: "DefaultApp2",
            url: "app/{controller}/{action}",
            defaults: new { controller = "app", action = "Index" }

попробуйте закомментировать один из них.

...