我的路线和行动有什么问题?

时间:2013-04-25 16:16:33

标签: asp.net-mvc-3 entity-framework razor entity

我最近根据如何根据内容表创建了一个问题,其中包含以下内容:标题内容。根据我的理解,我在answer that was given

中按照步骤进行操作

我创建了一条路线:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "ContentManagement",
            "{title}",
            new { controller = "ContentManagement", action = "Index", title = "{title}" }
        );

    }

我假设我可以做这样的路线?我可以在哪里设置多条路线?我也假设我可以将标题传递给控制器​​动作,就像我一样?

然后我创建了模型:

namespace LocApp.Models
{
    public class ContentManagement
    {
        public int id { get; set; }
        [Required]
        public string title { get; set; }
        public string content { get; set; }
    }
}

从那里我创建了一个控制器,其索引操作看起来像这样:

    public ViewResult Index(string title)
    {
        using (var db = new LocAppContext())
        {
            var content = (from c in db.Contents
                           where c.title == title
                           select c).ToList();

            return View(content);

        }
    }

然后我用“bla”的标题创建了一些内容,所以当我访问site.com/bla时,我收到一个错误,它无法找到“bla /”

有人可以告诉我我做错了什么吗?如果您熟悉asp.net mvc项目的默认布局,并且顶部有选项卡,我也会根据数据库中的标题创建一组指向页面的选项卡

1 个答案:

答案 0 :(得分:1)

主要问题是当您使用标题时,路由引擎将其与第一条路线匹配,并尝试按该标题查找控制器。我们已经实现了类似的东西,并发现通过显式定义哪些控制器对默认路由有效,它然后适当地处理了请求。我给出了一个控制器示例,我们允许它们适合我们的默认路由(主页,帮助和错误)。

您可能还希望阻止人们将内容与您的根级控制器相同的 TITLE ,因为这会很好地打击它。

    public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new {controller = "Home", action = "Index", id = UrlParameter.Optional},
                new {controller = "Home|Error|Help"},
                new[] {"UI_WWW.Controllers"});

            routes.MapRoute(
                "ContentManagement",
                "{title}",
                new {controller = "ContentManagement", action = "Index"});    

            }
}