【问题标题】:Parameters with + sign within the custom URL自定义 URL 中带有 + 号的参数
【发布时间】:2023-03-14 10:20:02
【问题描述】:

我正在尝试引用这样的图像:

<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 完成此任务?

【问题讨论】:

标签: c# asp.net-mvc


【解决方案1】:

你需要使用UrlEncode:

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

并且在方法中什么也不做:

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

【讨论】:

  • 我的网址保持这样:“/controller/method/samsung%20Galaxy%20A8”我尝试使用:“/controller/method/samsung%20Galaxy%20A8+”并使用“/controller/method/ samsung%20Galaxy%20A8%2B",但两者都不起作用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在我的设计中,我避免将模型字段直接用作 URL 的一部分。这不仅是对它们进行 URL 编码的问题(您总是可以这样做),而且还有可读性的问题。

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

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

    您可以自定义此过程,使其识别一些特定领域的单词等。但这是我在设计中始终遵循的总体思路。

    作为一种快速解决方案,您可以使用正则表达式来隔离可接受的单词,然后用破折号分隔它们以提高可读性:

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

    这样做时,您必须考虑可能的重复项。这种编码方式会丢失部分信息。

    如果您担心两个模型可能会与同一个 URL 发生冲突,那么您必须采取一些措施来消除冲突。一些网站将 GUID 附加到生成的 URL 以使其唯一。

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

    【讨论】:

    • 当我检查我的网址时,空格被编码,但 + 号不是:“/controller/method/samsung%20Galaxy%20A8+”我试过使用 %2B 和 %252B 但它不会工作。就像编码“部分”工作一样
    • 哪种编码?
    • 现在我使用了 Url.EscapeUristring() 并且我的字符串被编码:“/controller/method/samsung%20Galaxy%20A8%2B” 但它仍然不会触发控制器方法。会是什么?
    猜你喜欢
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多