0

我有一个名为 ArticleController 的控制器,它有一个返回 Article 视图的 Index 方法。这行得通。

但是,我希望能够处理 URL 中 Article/ 之后的任何文本,例如 Article/someText Article/fileNanme Article/etc

我认为通过实现以下内容会很简单:

// GET: /Article/{text}
public ActionResult Index(string someText)
{
    ...
}

这行不通。有任何想法吗?

更新:

查看路线:

    routes.MapRoute(
        name: "Articles",
        url: "Article/{*articleName}",
        defaults: new { controller = "Article", action = "Article", id= UrlParameter.Optional }
        ,
        constraints: new { therest = @"\w+" }
    );

 routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new {  controller="Home", action = "Index", id = UrlParameter.Optional }
    );

请参阅 ArticleController 方法:

public ActionResult Index()
    {
       ...
    }


    public ActionResult Article(string articleName)
    {
       ...
    }
4

3 回答 3

1

如果您使用的是标准路由,请将参数名称从 更改someTextid。否则,您必须为此参数创建自定义路由

于 2013-08-04T20:17:09.223 回答
1

您可以像这样向路由添加一个包罗万象的参数

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{*therest}",
                defaults: new { controller = "Home", action = "Index" }
            );

注意到星号了吗?这标记therest为“catch-all”参数,它将匹配 URL 中的所有剩余段。

在你的行动中,你会有

public ActionResult Article(string therest)
{
  /*...*/
}

这甚至适用于像“Home/Article/This/Is/The/Rest”这样的 URL,在这种情况下therest将具有值“This/Is/The/Rest”。

如果您想完全省略 URL 的控制器部分,您将拥有

routes.MapRoute(
                name: "Default",
                url: "Article/{*therest}",
                defaults: new { controller = "Home", action = "Index" }
            );

它将匹配诸如“Article/ThisIs/JustSomeText”之类的 URL。

如果你想therest至少包含一些东西,你可以添加一个路由约束:

routes.MapRoute(
                name: "Default",
                url: "Article/{*therest}",
                defaults: new { controller = "Home", action = "Index" },
                constraints: new { therest = @"\w+" }
            );

约束是一个正则表达式,therest必须匹配路由才能匹配。

Stephen Walther 有一篇关于路由和包罗万象的参数的好文章Stephen Walther 再次在这里有一篇关于路由约束的文章。

于 2013-08-04T20:20:38.470 回答
0

您需要定义路线才能使用您提到的网址。对于最新的 MVC4,路由文件存在于这个目录 App_Start/RouteConfig.cs

添加这个关于默认路由的新路由。

routes.MapRoute(
            name: "Custom",
            url: "Article/{someText}",
            defaults: new { controller = "Article", action = "Index" }
        );

立即尝试加载您的网址。它现在应该可以工作了。

于 2013-08-04T20:22:05.260 回答