【问题标题】:MVC route with single level单层 MVC 路由
【发布时间】:2019-07-16 10:27:14
【问题描述】:

我需要构建一个控制器动作来处理这种模式:

example.com/aString

其中 aString 可以是任意字符串集合中的任何一个。控制器将循环遍历每个可能的值,如果没有匹配,则重定向到 404。

我认为这只是重新编码包罗万象的问题,但到目前为止我还是一片空白。目前正在使用 Sherviniv 的建议:

//Catchall affiliate shortcuts.
routes.MapRoute(
   name: "affLanding",
   url: "{query}",
   defaults: new
   {
       controller = "Home",
       action = "MatchString"
   }
);

控制器:

public ActionResult MatchString(string query)
{
    _logger.Info("affLanding: " + query);
    return View();
}

如果我将“搜索”字符串硬编码到 route.config 中,则一切正常:

 routes.MapRoute(
       name: "search",
       url: "aString",
       defaults: new { controller = "home", action = "MatchString"}
        );

【问题讨论】:

    标签: asp.net-mvc-4 mvcroutehandler


    【解决方案1】:

    在路由配置中

      routes.MapRoute(
                     name: "Controller1",
                     url: "Controller1/{action}/{id}",
                     defaults: new { controller = "Controller1", action = "Index", id = UrlParameter.Optional }
                );
          routes.MapRoute(
                     name: "Controller2",
                     url: "Controller2/{action}/{id}",
                     defaults: new { controller = "Controller2", action = "Index", id = UrlParameter.Optional }
                );
    //Other controllers
      routes.MapRoute(
                name: "search",
                url: "{query}",
                defaults: new
                {
                    controller = "Home",
                    action = "MatchString"
                }
            );
            routes.MapRoute(
                            name: "Default",
                            url: "",
                            defaults: new
                            {
                                controller = "Home",
                                action = "Index"
                            }
         );
    

    在你的控制器中

     public ActionResult Index()
     {
      reutrn view();
     }
    
     public ActionResult MatchString(string query)
     {
     if(Your Condition)
     {
     //when string query doesnt find
      throw new HttpException(404, "Some description");
     }
      else
       {
         return view(Your model);
       }
     }
    

    请记住添加所有控制器的名称,因为如果您没有在路由配置中提及它们,服务器如何知道它是搜索参数还是不是。 希望对你有帮助

    【讨论】:

    • 谢谢,但是会产生运行时错误:名为 'bar' 的控制器上名为 'foo' 的操作上的路由模板 '/{query}' 不能以正斜杠开头。
    • @justSteve 查看新答案。我找到了解决办法
    • 感谢您的努力,但仍然得到:说明:HTTP 404。您正在寻找的资源(或其依赖项之一)可能已被删除、更改名称或暂时不可用。请检查以下 URL 并确保其拼写正确。
    • @justSteve 我刚刚又检查了一遍。它正在工作。您收到未找到错误后的 URL 是什么?
    • 您是否遵循路线配置的优先级?它必须与我的相同
    猜你喜欢
    • 2012-10-06
    • 2010-12-07
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多