带有模板占位符的 Url Helper 路由

Posted

技术标签:

【中文标题】带有模板占位符的 Url Helper 路由【英文标题】:Url Helper route with template placeholderse 【发布时间】:2014-10-14 18:10:23 【问题描述】:

我想遍历表数据并在表中填充链接。

表格中的每一行都有类似样式的链接,其中散布着几个不同的 id。我想使用 Url 工厂为 url 路由生成模板。

例如。

var urlHelper = new UrlHelper(HttpContext.Current.Request...);

 //code is a bit handwavy and may not compile
 var routeValues = new Dictonary<string,object>();
 routeData["action"] =  "myAction";
 routeData["controller"] =  "myAction";
 routeData["id1"] =  "0";
 routeData["id1"] =  "2";

 urlHelper.RouteUrl(routeValues);

MSDN REF UrlHelper.RouteUrl http://msdn.microsoft.com/en-us/library/dd505226(v=vs.118).aspx

我认为当我目前使用占位符时,它会编码“”符号,而我还没有真正解决它。我在我们的项目 url 中看到了一个“”,所以我想避免解码这些字符。

我也强烈希望避免使用 myId1 = -9999, myId=-9999, myString='-9999' 的解决方案,尽管如果必要的话,这是一个可以接受的解决方案。

有没有一个很好的解决方案来生成带有占位符的路线?

【问题讨论】:

【参考方案1】:

这些是必须进行 Url 编码的特殊字符,因此 Url Helper 方法将始终对这些字符进行编码。解决方法可能是使用占位符对生成的 url 进行 Url 解码。然后你需要进行任何替换,自己手动对值进行 url 编码!

像这样生成 url 模板(或者使用任何其他 UrlHelper 方法而不是 Url.RouteUrl):

var routeValues = new RouteValueDictionary();
routeValues["action"] = "myAction";
routeValues["controller"] = "myAction";
routeValues["id1"] = "0";

var urlTemplate = HttpUtility.UrlDecode(Url.RouteUrl(routeValues));

这将生成(使用 MVC 中的默认路由)url 模板 /myAction/myAction?id1=0。然后在替换占位符时,您需要自己对字符串值进行 url 编码:

String.Format(urlTemplate, HttpUtility.UrlEncode("123"))

这会生成/myAction/myAction?id1=123

我会小心使用这种方法,因为您需要手动将值转换为字符串并对其进行编码。这也假设像myAction 这样在您的url 模板中硬编码的值是安全的,不需要进行url 编码(因为我们正在解码生成的url)。

【讨论】:

以上是关于带有模板占位符的 Url Helper 路由的主要内容,如果未能解决你的问题,请参考以下文章

PowerPoint2010占位符

iOS 13 - 带有占位符的 UITextField 让应用程序崩溃

Laravel 数据库选择带有占位符的下拉菜单

文件名(在 Windows 上)和 URL 中用作占位符的最佳字符是啥?

SpringMVC RequestMapping 路径中带占位符的URL

带有可选占位符的 string.format()