首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用可选参数的MVC替代路由失败。

问使用可选参数的MVC替代路由失败。
EN

Stack Overflow用户
提问于 2014-10-08 01:11:27
回答 2查看 5.1K关注 0票数 6

我正在尝试在我的MVC 5 web应用程序中实现替代路由。

我有控制器代码:

代码语言:javascript
复制
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包含:

代码语言:javascript
复制
 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”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-08 15:27:49

找到答案了here。我需要使用param使?为空。

代码语言:javascript
复制
[Route("{param?}")]
[Authorize]
public ActionResult Index(string param = null) {
   ...
}

希望这能对未来的人有所帮助。我在这个话题上找不到多少参考资料。

票数 6
EN

Stack Overflow用户

发布于 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,您需要多个约束,和是一个可选的参数。

正如我们所知道的,应用?允许参数是可选的。因此,以上面的例子来说,人们可能会假设

代码语言:javascript
复制
[Route("users/{id:int?:min(1)}")]
public User GetUserById(int id = 1) { ... }

将id参数约束为大于0的整数或空(在这种情况下使用默认值1)。实际上,我们得到了错误消息:

类型为“DefaultInlineConstraintResolver”的内联约束解析器无法解析以下内联约束:“int?”。

事实证明,约束的顺序很重要!简单地将可选约束?放在所有其他约束之后,就会给出预期的行为

代码语言:javascript
复制
[Route("users/{id:min(1):int?}")]
public User GetUserById(int id = 1) { ... }

这也适用于两个以上的约束。

代码语言:javascript
复制
[Route("users/{id:min(1):max(10):int?}")]
public User GetUserById(int id = 1) { ... }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26247726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档