// GET:/ Article / {text}在MVC中?

时间:2013-08-04 20:12:54

标签: asp.net-mvc-4

我有一个名为ArticleController的控制器,它带有一个返回Article视图的Index方法。这很有效。

但是,我希望能够处理文章/文章后面的任何文本,例如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)
    {
       ...
    }

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以像这样

添加一个catch-all参数到路线
routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{*therest}",
                defaults: new { controller = "Home", action = "Index" }
            );

注意星号?这会将therest标记为“catch-all”参数,该参数将匹配网址中的所有剩余细分。

在你的行动中,你会有

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

即使对于“Home / Article / This / Is / The / Rest”这样的网址也适用,在这种情况下,therest的值为“This / Is / The / Rest”。

如果您想完全省略URL的控制器部分,那么

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

将匹配“Article / ThisIs / JustSomeText”等网址。

如果您希望therest至少包含某些内容,则可以添加路由约束:

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

约束是therest必须匹配的匹配路径的正则表达式。

Stephen Walther有一个nice article on routing and catch-all parameters。 Stephen Walther再次发表了一篇关于路由约束的文章here

答案 2 :(得分:0)

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

添加关于默认路线的新路线。

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

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