【问题标题】:Route Confusion with Single Action单一动作的路线混淆
【发布时间】:2021-12-07 23:05:57
【问题描述】:

我显然无法理解这里的路线或试图实现这是不可能的。

我的RouteConfig 中有这个:

 routes.MapRoute(
     name: "Explorer",
     url: "{controller}/{action}/{prefix}/{value}",
      defaults: new { controller = "Explorer", action = "Index", prefix ="", value = UrlParameter.Optional }
             );

Explorer 控制器中,我有以下内容:

[RoutePrefix("Explorer")]
public class ExplorerController : Controller
{        
    public ActionResult Index()
    {
        return View();
    }

    [Route("id/{value}")]
    public ActionResult Import(decimal? importId)
    {
        return View();
    }

    [Route("text/{value}")]
    public ActionResult Import(string importWindow)
    {
        return View();
    }
}

其中一个 ACTION(导入)具有不同的 PREFIX,例如 windowid,但每当我尝试访问它时(例如 https://localhost/Explorer/Import/window/helloWorldhttps://localhost/Explorer/Import/id/200) 它一直给我以下错误

当前对控制器类型的“导入”操作请求 “ExplorerController”在以下操作之间不明确 方法:System.Web.Mvc.ActionResult Import(System.Nullable`1[System.Decimal]) 类型 项目名称.Controllers.ExplorerController System.Web.Mvc.ActionResult 类型 projectname.Controllers.ExplorerController 上的 Import(System.String)

我知道它是模棱两可的,但我有一个前缀应该使它不模棱两可。

我在这里做错了什么,如果这不是正确的方法,如何实现这个结果?

【问题讨论】:

    标签: asp.net asp.net-mvc routes


    【解决方案1】:

    为控制器类中的操作方法应用[Route()] 属性:

    [RoutePrefix("Explorer")]
    public class ExplorerController : Controller
    {
        // GET: Explorer
        public ActionResult Index()
        {
            return View();
        }
    
        // Example: https://localhost/Explorer/Import/id/200
    
        [Route("Import/id/{importId:decimal}")]
        public ActionResult Import(decimal? importId)
        {
            return View();
        }
    
        // Example: https://localhost/Explorer/Import/window/helloWorld
    
        [Route("Import/{text}/{importWindow}")]
        public ActionResult Import(string importWindow)
        {
            return View();
        }
    }
    

    RegisterRoutes()方法中只定义Default路由:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        routes.MapMvcAttributeRoutes();
    
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
    

    【讨论】:

    • 很有道理,谢谢
    猜你喜欢
    • 2018-09-29
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2013-02-17
    • 2017-10-04
    • 2014-11-04
    • 1970-01-01
    相关资源
    最近更新 更多