【问题标题】:asp.net mvc and routingasp.net mvc 和路由
【发布时间】:2012-01-24 22:32:05
【问题描述】:

我在控制器中有以下操作

public ActionResult Index(int? pageNumber)
public ActionResult Details(string seoFriendlyName)

我想有以下路线:

~/article/ -> Action = Index, pageNumber = 1
~/article/page-5 -> Action = Index, pageNumber = 5
~/article/page-1 -> ~/article/
~/article/foo -> Action = Details, seoFriendlyName = foo

我尝试定义以下路线,但它不起作用:

routes.MapRoute(
                null,
                "article/page-{pageNumber}",
                new { controller = "MyController", action = "Index", pageNumber = 1 },
                new[] { "MyNamespace" }
);

routes.MapRoute(
                null,
                "article",
                new { controller = "MyController", action = "Index", },
                new[] { "MyNamespace" }
);

routes.MapRoute(
                null,
                "article/{seoFriendlyName}",
                new { controller = "MyController", action = "Details", },
                new[] { "MyNamespace" }
);

任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    您的要求是自相矛盾的。例如,如果您有一篇文章 seoFriendlyName == "page-6" 和实际 pageNumber == 2,应该选择什么路由?

    我建议您将要求更改为

    ~/article/ -> Action = Index, pageNumber = 1
    ~/article/page/5 -> Action = Index, pageNumber = 5
    ~/article/page/1 -> ~/article/
    ~/article/foo -> Action = Details, seoFriendlyName = foo
    

    然后你将有以下路线:

    routes.MapRoute(
                    null,
                    "article/page/{pageNumber}",
                    new { controller = "MyController", action = "Index", pageNumber = 1 },
                    new[] { "MyNamespace" }
    );
    
    routes.MapRoute(
                    null,
                    "article",
                    new { controller = "MyController", action = "Index", },
                    new[] { "MyNamespace" }
    );
    
    routes.MapRoute(
                    null,
                    "article/{seoFriendlyName}",
                    new { controller = "MyController", action = "Details", },
                    new[] { "MyNamespace" }
    );
    

    更新

    回应cmets:

    对于该特定要求,您需要以这种方式修改您的路线:

    routes.MapRoute(
                    null,
                    "article",
                    new { controller = "MyController", action = "Index", pageNumber = 1 },
                    new[] { "MyNamespace" }
    );
    
    routes.MapRoute(
                    null,
                    "article/page/{pageNumber}",
                    new { controller = "MyController", action = "Index", },
                    new[] { "MyNamespace" }
    );
    
    
    routes.MapRoute(
                    null,
                    "article/{seoFriendlyName}",
                    new { controller = "MyController", action = "Details", },
                    new[] { "MyNamespace" }
    );
    

    【讨论】:

    • 如果我调用Url.Action("Index", "MyController"),那么~/article/page 将被渲染而不是~/article
    • 如果您希望这是~/article,那么您需要更改路线顺序。此外,正如 Jan 建议的那样,您应该将默认 pageNumer 设置移动到另一条路线。我稍后会更新我的答案。
    【解决方案2】:

    你还没有告诉我们,什么是行不通的。 我唯一看到的是,您为 pageNumber 参数设置了错误的值。

    这应该会更好:

    routes.MapRoute(
        null,
        "article",
        new { controller = "MyController", action = "Index", pageNumber = 1 },
        new[] { "MyNamespace" }
    );
    
    routes.MapRoute(
        null,
        "article/page-{pageNumber}",
        new { controller = "MyController", action = "Index"},
        new[] { "MyNamespace" }
    );
    
    routes.MapRoute(
        null,
        "article/{seoFriendlyName}",
        new { controller = "MyController", action = "Details" },
        new[] { "MyNamespace" }
    );
    

    【讨论】:

    • 在您的示例中,如果我调用Url.Action("Index", "MyController", new { pageNumber = 1 }),它将呈现为~/article/page-1,我希望它呈现为~/article
    • 是的,将第一个的顺序改为路由。
    猜你喜欢
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2016-04-26
    相关资源
    最近更新 更多