自定义URL中带有+号的参数

时间:2018-03-12 16:43:19

标签: c# asp.net-mvc

我试图引用这样的图像:

<img src="/controller/method/@Model.attribute">

直到该属性具有加号才有效。我已经知道+符号有语义含义,但我想保留它,因为有些值有加号。

我试过了:

<img src="/controller/method/@HttpUtility.HtmlEncode(@Model.attribute)">

在服务器端:

public method(string param)
{
   string p = HttpUtility.HtmlDecode(param);
}

如何使用ASP.NET MVC 5实现此目的?

3 个答案:

答案 0 :(得分:2)

您需要使用UrlEncode:

<img src="/controller/method/@HttpUtility.UrlEncode(Model.attribute)">

在方法中什么都不做:

public ActionResult method(string param){
    // param should already be decoded
}

答案 1 :(得分:1)

在尝试重现您描述的场景时,做了一些测试并获得了错误页面。 404.11 以下是相关问题:double escape sequence inside a url : The request filtering module is configured to deny a request that contains a double escape sequence

答案 2 :(得分:0)

在我的设计中,我避免直接​​使用模型字段作为URL的一部分。这不仅是对URL进行编码的问题 - 您可以随时进行 - 而且还有可读性问题。

我所做的是将另一个字段添加到模型中,这是属性的URL就绪表示。该字段可以通过仅接受字母和数字并用短划线替换空格或任何其他字符来从原始字段计算。

例如,如果您将属性设置为someone's pencil + one,则此属性的自动创建的网址版本为someone-s-pencil-one

您可以自定义此过程,使其识别某些特定于域的单词等。但这是我在设计中始终遵循的一般概念。

作为一种快速解决方案,您可以使用正则表达式来隔离可接受的单词,然后使用短划线将它们分开以获得更好的可读性:

string encoded = string.Join("-",
    Regex.Matches(attributeValue, @"[a-zA-z0-9]+")
        .Cast<Match>()
        .Select(match => match.Value)
        .ToArray());

完成此操作后,您必须考虑可能的重复项。使用此编码会丢失部分信息。

如果您担心两个模型可能会与同一个网址冲突,那么您必须采取措施来打破冲突。有些网站会在生成的网址上附加一个GUID,以使其唯一。

另一种可能性是生成一个短随机字符串,仅限3-5个字母,并将其存储在数据库中,以便您可以控制其唯一性。此解决方案中的所有内容都从属于可读性,请牢记这一点。