在ASP中路由可选参数.asp.net MVC 5

本文关键字:asp net MVC 参数 ASP 路由 | 更新日期: 2023-09-27 18:12:24

我正在创建一个ASP。. NET MVC 5应用程序和我有一些问题的路由。我们在web应用程序中使用属性Route来映射路由。我有以下动作:

[Route("{type}/{library}/{version}/{file?}/{renew?}")]
public ActionResult Index(EFileType type, 
                          string library, 
                          string version, 
                          string file = null, 
                          ECacheType renew = ECacheType.cache)
{
 // code...
}

我们只能访问这个URL,如果我们在url的末尾传递斜杠字符/,像这样:

type/lib/version/file/cache/

它工作得很好,但没有/不工作,我得到一个404未发现错误,像这样

type/lib/version/file/cache

或this(不带可选参数):

type/lib/version

我想在url的末尾使用或不使用/ char访问。最后两个参数是可选的。

我的RouteConfig.cs像这样:

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

我怎么解决它?使斜杠/也是可选的吗?

在ASP中路由可选参数.asp.net MVC 5

也许你应该尝试把你的枚举作为整数来代替?

我是这样做的

public enum ECacheType
{
    cache=1, none=2
}
public enum EFileType 
{
    t1=1, t2=2
}
public class TestController
{
    [Route("{type}/{library}/{version}/{file?}/{renew?}")]
    public ActionResult Index2(EFileType type,
                              string library,
                              string version,
                              string file = null,
                              ECacheType renew = ECacheType.cache)
    {
        return View("Index");
    }
}

和我的路由文件

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

然后我可以调用

http://localhost:52392/2/lib1/ver1/file1/1
http://localhost:52392/2/lib1/ver1/file1
http://localhost:52392/2/lib1/ver1

http://localhost:52392/2/lib1/ver1/file1/1/
http://localhost:52392/2/lib1/ver1/file1/
http://localhost:52392/2/lib1/ver1/
//its working with mvc5
[Route("Projects/{Id}/{Title}")]
public ActionResult Index(long Id, string Title)
{
    return view();
}