我正在尝试在我的MVC 5 web应用程序中实现替代路由。
我有控制器代码:
namespace MyMvcProject.Web.Controllers
{
[RoutePrefix("account")]
public class AccountController : Controller {
[Route("{param}")]
[Authorize]
public ActionResult Index(string param = null) {
...当点击url:http://example.com/account/testparam时,效果很好。但是,我希望能够将值param作为可选参数。
我尝试过将[Route("{param}")]更改为[Route("{param}*")],但是从未输入Index()方法。我也尝试过将它更改为[Route("{param:string=Test}")],但是我得到了一个使用术语string的路由运行时错误。
我的RoutConfig.cs包含:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{param}",
defaults: new { controller = "Home", action = "Index", param = UrlParameter.Optional }
);
}有人知道我如何使用这种替代的路由语法强制Index()有一个可选的参数吗?它在我的应用程序的其他部分非常有用,所以我想保留RoutePrefix和Route装饰器。
更新
我仍然在试图解决这个问题,所以我将我的路由装饰器更改为[Route("{param:int=0}")],我的构造函数更改为public ActionResult Index(int id),它按预期工作(即,http://example.com/account的行为就像输入了http://example.com/account/0一样)。这正是我想要的,只使用string数据类型。
当我将装饰器更改为:[Route("{id:string=\"\"}")]并将构造函数更改为public ActionResult Index(string id)时,我会看到运行时错误:
类型为“DefaultInlineConstraintResolver”的内联约束解析器无法解析以下内联约束:“string”。
发布于 2014-10-08 15:27:49
找到答案了here。我需要使用param使?为空。
[Route("{param?}")]
[Authorize]
public ActionResult Index(string param = null) {
...
}希望这能对未来的人有所帮助。我在这个话题上找不到多少参考资料。
发布于 2014-12-18 20:22:33
@Brett的回答很棒:将?添加到路由属性中的参数,然后在Action中提供默认值,允许该参数是可选的。
这是Mike关于Attribute Routing in Web API 2的一篇优秀文章,其中包括一篇关于可选参数的文章。
Mike还谈到了应用多个约束,并说:
可以将多个约束应用于由冒号分隔的参数。 路由(“User /{id:int:min(1)}”)公共用户GetUserById(int id) {.}
它也适用于great...until,您需要多个约束,和是一个可选的参数。
正如我们所知道的,应用?允许参数是可选的。因此,以上面的例子来说,人们可能会假设
[Route("users/{id:int?:min(1)}")]
public User GetUserById(int id = 1) { ... }将id参数约束为大于0的整数或空(在这种情况下使用默认值1)。实际上,我们得到了错误消息:
类型为“DefaultInlineConstraintResolver”的内联约束解析器无法解析以下内联约束:“int?”。
事实证明,约束的顺序很重要!简单地将可选约束?放在所有其他约束之后,就会给出预期的行为
[Route("users/{id:min(1):int?}")]
public User GetUserById(int id = 1) { ... }这也适用于两个以上的约束。
[Route("users/{id:min(1):max(10):int?}")]
public User GetUserById(int id = 1) { ... }https://stackoverflow.com/questions/26247726
复制相似问题