【问题标题】:Asp.net MVC 5 Attribute Routing ConstraintAsp.net MVC 5 属性路由约束
【发布时间】:2018-03-27 23:22:56
【问题描述】:

看帮助Attribute Routing in ASP.NET MVC 5很容易看出如何约束参数如下:

[Route("edit/{promoId:int?}")]
public ActionResult Edit(int? promoId) { … } 

所以这条路线只接受带有int值或空的promoId

此路由的一些有效 URL 是:

/promotions/edit/5
/promotions/edit/

但是如何设置RouteAttribute 来接受“/promotions/edit/promoId=5”?

【问题讨论】:

    标签: c# asp.net-mvc routes


    【解决方案1】:

    您尝试通过将此类 URL 指向您的操作,将其设置在 App_Start 文件夹中的 RouteConfig.cs 中。

    routes.MapRoute(
               name: "Edit",
               url: "{controller}/{action}/promoId={promoId}",
               defaults: new { controller = "Promotions", action = "Edit", promoId = UrlParameter.Optional }
    );
    

    【讨论】:

    • 这样做的问题是,如果您将 promoId 作为 Int 类型,如果 url 尝试传递字符串,则会收到错误消息。我正在努力避免谷歌爬虫出现这个错误。
    • 它不会被路由到这个 URL,因为它需要有一个整数。尝试使用 PostMan 或 Telerik Fiddler 进行测试
    • 有效!与您评论的唯一不同的是,当参数类型不同时调用控制器操作,但没有向它传递任何值,因为它是 int?测试在这里:github.com/mqueirozcorreia/AspnetMVCRouteTest
    • @mqueirozcorreia:请注意;虽然这是获得结果的好方法,但 url 格式并不常见。通常使用? 查询字符串标记或以www.example.org/something/promoId/someotherIdperhaps/ 类似格式分隔参数
    • @mqueirozcorreia 好吧,至少你得到了正确的路线。由 API 的消费者/用户来解析结果。很高兴为您提供帮助,祝您的项目好运。
    【解决方案2】:

    其实我觉得url应该是这样的格式:

    /promotions/edit?promoId=5

    注意?。它是查询字符串标记的开始。

    这样应该是可以的:

    [Route("edit")]
    public ActionResult Edit([FromUri]int promoId)
    {
        ...
    }
    

    【讨论】:

    • 为什么 promoId 不是 int?
    • 我可以看到您将 promoId 从字符串转换为 int 的想法。我认为它有效,但不应该更好地使用约束?我尝试使用两条路线,如下所示: [Route("edit/promoId={promoId:int?}")] [Route("edit/{promoId:int?}")] 我可以使用 promoId 作为整数和可选.你怎么看?
    • @Coding: 抱歉,我的错字很糟糕
    • @mqueirozcorreia:对不起,我的意思是 int;对我来说已经是深夜了;-)
    • Asp.net MVC 有一个等价于 [FromUri] 的答案如下:stackoverflow.com/a/28769621/3424212 但是当 promoId 不是错误时,我们会得到错误。测试在这里:github.com/mqueirozcorreia/AspnetMVCRouteTest
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2014-02-12
    • 2016-11-01
    • 2013-10-28
    • 2015-05-02
    • 2014-11-14
    相关资源
    最近更新 更多