如何在 ASP.NET 中创建无密钥 URL 参数

How to create keyless URL parameters in ASP.NET

我看到 this answer 描述了 ASP.NET 对无键(不是无值)参数的支持,例如 http://some.url?param1&param2,并确认它们可以在 Request.QueryString 上查看,例如:

var values = this.Request.QueryString.GetValues(null);
values.Any(o => o == "param1");

这很好,但现在我想生成这样的 url。我的第一直觉是使用 Url.ActionRouteValueDictionary: routeValues 参数并将 null 作为键:

@{ 
    var dict = new RouteValueDictionary();
    dict.Add(null, "param1");
    dict.Add(null, "param2");
}
<a href="@Url.Action("ActionName", dict)">Very link, amaze</a>

但显然是 C# forbids nulls as dictionary keys 因为某些原因。

我也尝试过将空字符串作为键,但它会生成如下查询字符串:?=param1,=param2 其中包含我想要的另外 2 个等号。

当然我可以对 URL 进行字符串操作并将 &param1 部分添加到查询字符串中,但我希望得到一个简洁的解决方案。

您想添加键值,但不允许将值保留为 null。

RouteValueDictionary ignores empty values

例如,您可以添加像 1 这样的值,但是您失去了很好的解决方案。

    @{
        var dict = new RouteValueDictionary();
        dict.Add("param1",1);
    }
    <a href="@Url.Action("Index", dict)">Very link, amaze</a>

对于另一种解决方案,您将必须编写一些自定义代码。

既然没有内置的帮助程序,为什么不自己动手:

public static class UrlHelperExtensions
{
    public static string MyAction(this UrlHelper urlHelper, string actionName, IList<string> parameters)
    {
        string url = urlHelper.Action(actionName);
        if (parameters == null || !parameters.Any())
        {
            return url;
        }

        return string.Format("{0}?{1}", url, string.Join("&", parameters));
    }
}

然后:

@{
    var parameters = new List<string>();
    parameters.Add("param1");
    parameters.Add("param2");
}

@Url.MyAction("ActionName", parameters)