【问题标题】:How to Deal with Unused MVC Routing Parameters如何处理未使用的 MVC 路由参数
【发布时间】:2017-03-29 10:27:27
【问题描述】:

我有一个 MVC 应用程序,并且 UI 团队要求职业页面的 URL 遵循以下格式:mydomain.com/careers/{jobTitle}/{JobCode}。我可以像这样在职业控制器中做到这一点:

    public ActionResult Detail(string jobTitle, string jobCode)
    {
        var model = getModelFromDb(JobCode);
        return View(model);
    }

问题是我们通过工作代码而不是标题来查找职业信息,所以我们最终得到了一个未使用的参数。我认为这不是最佳做法。特别是因为您可以输入任何您想要的职业头衔,并且仍然可以获取工作详细信息。像这样的网址仍然可以使用:mydomain.com/careers/yourmom/1234。

我想我们总是可以通过标题和代码来查找职业,但这似乎毫无意义,因为代码是独一无二的。

有没有更好的方法来实现 url 中的额外参数并避免在 url 中放置无效的职位名称?

【问题讨论】:

  • 您可以尝试的一件事是将 jobTitle 设为可选,但这意味着将 url 格式更改为 {JobCode}/{jobTitle},我想这不是一个选项?
  • 看看这个问题并回答stackoverflow.com/questions/24678045/…。可以在路由中使用可选参数
  • 我猜你可能想要一个“slug”路由(其中仅包含jobCode 将导致一个带有jobcodejobTitle 的url)?如果有,请参考this answer

标签: c# asp.net-mvc url asp.net-mvc-routing


【解决方案1】:

您可以创建your own custom route constraint,这将允许仅匹配包含与jobcode匹配的jobtitle的路由。

您必须继承 IRouteConstraint 接口并实现 Match 方法。该方法接收的参数之一是RouteValueDictionary

它是包含路由参数的键/值对的集合。您可以使用它们来查找职位并确保它与职位代码一致。

See this example for more info.

通过这种方式,您将能够只接收正确的路线并拒绝不正确的路线,例如mydomain.com/careers/yourmom/1234

【讨论】:

    【解决方案2】:

    我们最终做的是将两个参数(jobTitle 和 jobCode)传递给控制器​​,通过 jobCode 查找记录,并验证记录的 slug 是否与传入的 jobTitle 匹配(不区分大小写)。通过这种方式,我们可以防止虚假网址返回工作详细信息页面,并让 UI 团队满意。

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2021-08-30
      • 2012-11-13
      • 2019-10-21
      相关资源
      最近更新 更多