ActionLink中的URL编码参数?

时间:2009-11-30 11:55:24

标签: asp.net-mvc encode actionlink

我注册了以下路线;

        routes.MapRoute(
            "LocationsByArea",                                              
            "Locations/{system}/{storage}/{area}",          
            new { controller = "StorageLocation", action = "Index" },
            null
        );

...以及我视图中的以下代码;

<%= Html.ActionLink("Platser", "Index", "StorageLocation", new { system = Model.System, storage = Model.Storage, area = item.Name }, null)%>

我的问题是当“area = item.Name”包含冒号时,例如“区域4:1”。如果我单击渲染的链接,我会收到HTTP错误400,Bad reqest。我想我必须以某种方式编码我的区域参数,但我无法弄清楚如何。任何帮助都是相关的。

谢谢!

3 个答案:

答案 0 :(得分:1)

内置编码/解码不起作用,所以我建议你自己滚动,如下所示:

namespace MyProject.Helpers
{
    public static class JobNameHelper
    {
        public static string JobNameEncode(string jobname)
        {
            return jobname.Replace(":", "---colon---");
        }

        public static string JobNameDecode(string jobname)
        {
            return jobname.Replace("---colon---", ":");
        }

    }
}

答案 1 :(得分:0)

你能不能只使用

Server.UrlEnconde(item.Name)

或者我错过了什么?

在您的路由中,您可能还必须使用Server.UrlDecde,但我认为它应该根据您的要求解码。

尝试使用Routing Debugger来查看url路由器通过的内容,然后您可以看到解码需要发生的位置

答案 2 :(得分:0)

ASP.NET 3.5 SP1及更早版本对哪些URL有效有许多限制。在ASP.NET 4中,大多数这些问题都已得到修复(或者至少可以通过web.config进行自定义)。我认为由于安全问题,即使在编码时,冒号字符也可能不允许在ASP.NET 3.5 SP1及更早版本中使用。在执行文件检查时允许冒号可能是一个安全问题,因为它们是NTFS Alternate Data Streams的鲜为人知的语法。

为了这些目的,我建议尝试选择冒号以外的字符。也许逗号,分号或等号可能会起作用吗?