具有一个固定动作的MVC路由和具有多个可选参数的控制器

adn*_*nan 3 c# asp.net-mvc asp.net-mvc-routing

基本上我有一个问题,我想在多个控制器中进行一个默认操作,并使用我的自定义URL的多个可选参数,如下所示:

www.mydomain.com/{controller name}/{v1}/{v2}/{v3}/{v4}

并且也不希望在url中使用动作名称.我在routeconfig.cs中有这个路由

routes.MapRoute(
    name: "Blog",
    url: "{controller}/{v1}/{v2}/{v3}/{v4}",
    defaults: new
    {
        controller = "Blog",
        action = "searchBlog",
        v1 = UrlParameter.Optional,
        v2 = UrlParameter.Optional,
        v3 = UrlParameter.Optional,
        v4 = UrlParameter.Optional
    });

routes.MapRoute(
    name: "Forum",
    url: "{controller}/{v1}/{v2}/{v3}/{v4}",
    defaults: new
    {
        controller = "Forum",
        action = "searchForum",
        v1 = UrlParameter.Optional,
        v2 = UrlParameter.Optional,
        v3 = UrlParameter.Optional,
        v4 = UrlParameter.Optional
    });
Run Code Online (Sandbox Code Playgroud)

行动 BlogController

public ActionResult searchBlog(string v1=null,string v2 = null, string  v3 = null, string v4 = null)
{
    // use optional parameters here
    return View("Index");
}
Run Code Online (Sandbox Code Playgroud)

行动 ForumController

public ActionResult searchForum(string v1=null,string v2 = null, string  v3 = null, string v4 = null)
{
    // use optional parameters here
    return View("Index");
}
Run Code Online (Sandbox Code Playgroud)

我的动作用0,3和4参数命中,但在传递1或2参数时无法命中.

例如

  1. www.mydomain.com/{controller name}/{v1}/{v2}

  2. www.mydomain.com/{controller name}/{v1}

请帮助我/指导我,在我提到我的要求时,在MVC中使用路由的正确方法是什么.我很感激你的宝贵时间.提前致谢.

Usm*_*man 5

您必须通过修复每个控制器的路由来设置这样的路由配置,否则将为上述类型的场景调用默认路由配置,路由将变为这样.

www.mydomain.com/blog/{v1}/{v2}/{v3}/{v4}

此路由仅适用于博客控制器,因为我们已在此配置中修复了路由.

routes.MapRoute(
        name: "Blog",
        url: "blog/{v1}/{v2}/{v3}/{v4}",
        defaults: new
        {
            controller = "Blog",
            action = "searchBlog",
            v1 = UrlParameter.Optional,
            v2 = UrlParameter.Optional,
            v3 = UrlParameter.Optional,
            v4 = UrlParameter.Optional
        });
Run Code Online (Sandbox Code Playgroud)

您必须为论坛的每个控制器手动执行此操作,结果路由仅适用于论坛控制器.

www.mydomain.com/forum/{v1}/{v2}/{v3}/{v4}

routes.MapRoute(
        name: "Forum",
        url: "forum/{v1}/{v2}/{v3}/{v4}",
        defaults: new
        {
            controller = "Forum",
            action = "searchForum",
            v1 = UrlParameter.Optional,
            v2 = UrlParameter.Optional,
            v3 = UrlParameter.Optional,
            v4 = UrlParameter.Optional
        });
Run Code Online (Sandbox Code Playgroud)

  • 您不能有多个可选参数.只有最后一个参数可以是`UrlParameter.Optional`(如果只提供1或2或3个参数,则路由引擎无法匹配值,因此它们将转换为查询字符串值,而不是路由值.删除`UrlParameter.Optional `除了最后一个参数之外的所有参数 (3认同)