【问题标题】:MVC route, query parametersMVC路由,查询参数
【发布时间】:2011-10-20 01:18:58
【问题描述】:

两个简单的 mvc3 路由,用户名和一个默认路由。

routes.MapRoute(
    "Users", 
    "{username}",  
    new { controller = "User", action = "Index"} 
);

routes.MapRoute(
    "Default", 
    "{*url}", 
    new { controller = "Default", action = "Index" }  
);

如何让用户路由接受任何额外的查询参数,例如 /username?ref=facebook 这个例子只是默认路由的头......

编辑: MY BAD 对此感到有些惊讶,因为它不应该关心查询参数。 解决方案 = 清理并重建项目。

【问题讨论】:

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


    【解决方案1】:

    如下更新您的第一条路线:

    routes.MapRoute(
        "Users", 
        "/username",  
        new { controller = "User", action = "Index"} 
    );
    

    在你的控制器 Action 中添加一个参数“ref”,以便 MVC 自动将查询字符串“ref”传递给你的控制器。

    【讨论】:

      【解决方案2】:

      ?ref= 等查询字符串参数不属于 Route 段定义的一部分。例如,类似的路线:

      routes.MapRoute(
                      "Default", 
                      "{controller}/{action}", 
                      new { controller = "Home", action = "Index"}
                  );
      

      仍会匹配如下网址:/Home/Index?ref=facebook

      因此,您不必更改路线以适应临时查询字符串。在 Actions/Controller 中处理它们是另一回事,因为您必须遵循 CoC 约定而不是配置指南,并匹配 Actions 中的查询字符串参数。

      【讨论】:

        【解决方案3】:

        将参数添加到路由中,不要忘记将其添加到您的操作中。 我建议在 url 的开头添加一些内容以使其更具体(以防您在项目中添加任何其他路由) 示例

        routes.MapRoute(
            "Users",
            "users/{username}/{ref}",
            new { controller = "User", action = "Index", ref = UrlParameter.Optional }
        );
        

        在你想要的行动中

        public ActionResult Index(ref)
        {
            if (string.IsNullOrEmpty(ref))
            {
                //TODO: add your logic here
            }
        }
        

        这应该接受 /users/someusername/facebook.com 或 /users/someusername?ref=facebook.com

        【讨论】:

          猜你喜欢
          • 2012-07-26
          • 1970-01-01
          • 2013-05-14
          • 1970-01-01
          • 2022-12-05
          • 1970-01-01
          • 2016-11-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多