我有一个MVC应用程序,UI团队已经请求了一个职业页面的网址遵循以下格式:mydomain.com/careers/{jobTitle}/{JobCode}
。我可以在职业控制器中这样做:
public ActionResult Detail(string jobTitle, string jobCode)
{
var model = getModelFromDb(JobCode);
return View(model);
}
问题是我们通过工作代码而不是标题查找职业信息,因此我们最终得到一个未使用的参数。我不认为这是最佳做法。特别是因为你可以输入任何你想要的职业头衔,但仍然可以获得工作细节。像这样的网址仍然可以使用:mydomain.com/careers/yourmom/1234。
我想我们总是可以通过标题和代码来查找职业,但这似乎没有意义,因为代码是独一无二的。
是否有更好的方法在网址中实施额外参数,并且不允许将无效的职位名称放入网址?
答案 0 :(得分:2)
您可以创建your own custom route constraint,这将只允许匹配包含与作业代码匹配的作业标题的路线。
您必须继承IRouteConstraint
界面并实施Match
方法。该方法接收的参数之一是RouteValueDictionary
。
它是包含路由参数的键/值对的集合。您可以使用它们来查找职位,并确保它与职务代码保持一致。
See this example for more info
通过这种方式,您将只能接收正确的路线并拒绝错误的路线,例如mydomain.com/careers/yourmom/1234
答案 1 :(得分:0)
我们最终做的是将两个参数传递给控制器(jobTitle和jobCode),通过jobCode查找记录,并验证记录的slug是否与传入的jobTitle匹配(所有不区分大小写)。这样我们就可以防止虚假网址返回作业详细信息页面,并让UI团队保持高兴。