我有一个名为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)
{
...
}
答案 0 :(得分:1)
如果您使用的标准路由更改参数名称从someText
到id
。否则,您必须为此参数创建自定义路由
答案 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
必须匹配的匹配路径的正则表达式。
答案 2 :(得分:0)
您需要定义路线才能使用您提到的网址。对于最新的MVC4,路径文件存在于此目录App_Start / RouteConfig.cs
中添加关于默认路线的新路线。
routes.MapRoute(
name: "Custom",
url: "Article/{someText}",
defaults: new { controller = "Article", action = "Index" }
);
立即尝试加载您的网址。它现在应该工作。