【问题标题】:URL Routing with an MVC使用 MVC 的 URL 路由
【发布时间】:2016-09-08 19:34:47
【问题描述】:

我正在制作一个显示大量文章的网站。它是基于 MVC 构建的,我希望能够按天搜索文章,然后通过 url 通过 ID 号搜索文章。

如果域名是 website.com,我正在尝试弄清楚如何制作路由,以便 website.com/yyyymmdd 命中特定的控制器+方法并显示当天的所有文章和 website.com/yyyymmdd /111 在当天的文章中搜索文章 #111。

我遇到的问题是 MVC 中的所有路由教程都假设我将在 URL 中指定控制器和方法。它们显示如下:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new { controller = "Home", action = "Index", id = "" });
    }

如果有人可以建议一种方法来自动使“website.com/yyyymmdd/111”使用指定的控制器和方法,那就太棒了。提前致谢!

编辑:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            "Today",
            "{date}/{id}",
            new { controller = "Articles", action = "Index", date = DateTime.Today.ToString("yyyyMMdd"), id = UrlParameter.Optional });
    }

我已经把这个作为我的路线,我的方法如下:

    public ActionResult ArticlesByDate(string date, int id)
    {
        if(id > 1)
        {
            return View(Contact());
        }
        else
        {
            return View(About());
        }

    }

我希望我能理解你们的建议,但是当我尝试导航到:“http://localhost:52159/20160908/2”时,这给了我一个“找不到资源”错误

【问题讨论】:

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


【解决方案1】:

解决此问题的一种方法是使用日期作为操作的参数。

你的动作看起来像

public ActionResult Index(string articleDate,string id) ... 

您的路线定义类似于

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapRoute(
            "Default",
            "{controller}/{action}/{articleDate}/{id}",
            new { controller = "Home", action = "Index",articleDate=DateTime.Today.ToString("yyyyMMdd"), id = "" });
}

然后你可以从那里拿走它

【讨论】:

    【解决方案2】:

    默认 mvc 路由机制的第二个路由。

    第一条路线是为articles.Controller 和动作值是静态的。您可以更改 website.com/20160911/111 、 website.com/20160912/112 等的日期和 id 值。

        public static void RegisterRoutes(RouteCollection routes)
        {
          routes.MapRoute(
              name: "Articles",
              url: "{date}/{id}",
              defaults: new { controller = "Articles", action = "Info"});
    
          routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
        }
    
       public class ArticleController : Controller {
    
            public ActionResult Info(string date, int id){
    
                return View();
    
            } 
        }
    

    您不能在一个操作中重定向两个视图。在其中使用一个视图和部分视图。

    例如

    Info.cshtml

        @if(id > 1)
        {
            @Html.Partial("_Contact") 
        }
        else
        {
            @Html.Partial("_About") 
        }
    

    【讨论】:

    • 你显然错过了日期的路线限制(一旦回到默认值就错了),否则正是 OP 正在寻找的。​​span>
    • 为什么回退默认我不明白:(我除了它会路由文章控制器信息操作@AlexeiLevenkov
    • @SercanTimoçin 感谢您的建议!这似乎正是我所需要的。但是我现在遇到了另一个问题。我正在把我的进步放在 OP 中。
    猜你喜欢
    • 2010-11-22
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    相关资源
    最近更新 更多