You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC 5.2.7如何获取查询字符串参数的原始值?

获取ASP.NET MVC 5.2.7中查询字符串参数的原始编码值

我之前也碰到过这个需求——默认的Request.QueryString确实会自动帮你解码参数值,把%20和+都转换成空格,没法区分原始的编码形式。不过不用自己从头实现解析逻辑,用.NET Framework内置的服务器变量或者Uri属性就能搞定:

方法1:利用Request.ServerVariables获取原始查询串

服务器变量QUERY_STRING会直接返回未经任何解码的原始查询字符串内容(不包含开头的?),你可以基于它拆分出每个参数的原始键值对:

// 获取原始查询字符串
string rawQuery = Request.ServerVariables["QUERY_STRING"];

if (!string.IsNullOrEmpty(rawQuery))
{
    // 拆分每个键值对
    var rawParams = rawQuery.Split('&')
                            .Where(param => !string.IsNullOrWhiteSpace(param))
                            .Select(param =>
                            {
                                // 按第一个=拆分,避免参数值里包含=的情况
                                var keyValueParts = param.Split(new[] { '=' }, 2);
                                return new
                                {
                                    Key = keyValueParts[0],
                                    RawEncodedValue = keyValueParts.Length > 1 ? keyValueParts[1] : string.Empty
                                };
                            });

    // 提取目标参数p的原始值
    string pRawValue = rawParams.FirstOrDefault(p => p.Key == "p")?.RawEncodedValue;
    // 此时pRawValue会是"lol%20cat"或"lol+cat",完全保留原始编码
}

方法2:通过Request.Url.Query获取原始查询串

如果更习惯用Uri相关的属性,也可以用Request.Url.Query,它返回的是包含开头?的原始查询串,只需要先去掉开头的?再拆分即可:

string rawQueryWithPrefix = Request.Url.Query;

if (!string.IsNullOrEmpty(rawQueryWithPrefix) && rawQueryWithPrefix.StartsWith("?"))
{
    string rawQuery = rawQueryWithPrefix.Substring(1);
    // 后续拆分逻辑和方法1完全一致
    var rawParams = rawQuery.Split('&')
                            .Where(param => !string.IsNullOrWhiteSpace(param))
                            .Select(param =>
                            {
                                var keyValueParts = param.Split(new[] { '=' }, 2);
                                return new
                                {
                                    Key = keyValueParts[0],
                                    RawEncodedValue = keyValueParts.Length > 1 ? keyValueParts[1] : string.Empty
                                };
                            });

    string pRawValue = rawParams.FirstOrDefault(p => p.Key == "p")?.RawEncodedValue;
}

为什么不用Request.QueryString?

Request.QueryString内部会自动执行URL解码,它会把%20(URL编码的空格)和+(表单编码的空格)统一转换成空格字符,所以没法区分原始的编码形式,这也是你只能拿到解码后值的原因。

上面两种方法都是基于.NET内置的原始请求数据,完全可靠,不需要自己实现复杂的URL解析逻辑。

内容的提问来源于stack exchange,提问作者Gérard Lambert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:45:59