【问题标题】:MVC routing with one fixed action and controllers with multiple optional parameters具有一个固定动作的 MVC 路由和具有多个可选参数的控制器
【发布时间】:2016-02-17 06:32:25
【问题描述】:

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

www.mydomain.com/{控制器名称}/{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
    });

BlogController中的操作

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

ForumController 中的操作

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

我的动作用 0、3 和 4 个参数命中,但传递 1 或 2 个参数时不能命中。

例如

  1. www.mydomain.com/{控制器名称}/{v1}/{v2}

  2. www.mydomain.com/{控制器名称}/{v1}

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

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-routing


    【解决方案1】:

    您必须通过为每个控制器固定路由来设置这样的路由配置,否则将为您上面提到的那种场景调用默认路由配置,并且路由将变成这样。

    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
            });
    

    您还必须为论坛的每个控制器手动执行此操作,生成的路由仅适用于论坛控制器。

    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
            });
    

    【讨论】:

    • 您不能有多个可选参数。只有最后一个参数可以是UrlParameter.Optional(如果只提供 1 或 2 或 3 个参数,则路由引擎无法匹配值,因此它们将转换为查询字符串值,而不是路由值。从所有但删除 UrlParameter.Optional最后一个参数。
    • @Stephen 是的,这是重点,但我需要的只是查询整个 url 的字符串值。谢谢你的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2016-02-15
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多