Как передать массив int в RouteValueDictionary - PullRequest
8 голосов
/ 18 июня 2011

Мне нужно сгенерировать этот URL: http://localhost:3178/Reports/?GroupId=1211&GroupId=1237

Я пытаюсь:

var routeData = new RouteValueDictionary();
routeData.Add("GroupId", "1, 2");

получить: GroupId=1,%202

или

routeData.Add("GroupId", "1");
routeData.Add("GroupId", "2");

получение: элемент с тем же ключом уже добавлен

и даже

routeData.Add("GroupId[0]", "1");
routeData.Add("GroupId[1]", "2");

получение: ?GroupId%5B0%5D=1&GroupId%5B1%5D=2

возможно как-то решить мою проблему

1 Ответ

1 голос
/ 11 октября 2011

RouteValueDictionary предназначен для предоставления информации для маршрутов. Поэтому я не думаю, что у вас есть такая возможность, о которой вы просили. Я использовал пользовательский помощник для заполнения данных строки запроса, основываясь на том, что я передаю в него:

    public static string BuildPath(RequestContext context, string routeName, RouteValueDictionary routeValues, object additionalParams)
    {
        var vpd = RouteTable.Routes[routeName].GetVirtualPath(context, routeValues);

        if (vpd == null)
            return string.Empty;

        var virtualpath = vpd.VirtualPath;
        var addparams = BuildAdditionalParams(additionalParams);

        if (!virtualpath.Contains("?") && addparams.Length > 0)
            virtualpath = virtualpath + "?" + addparams;
        else if (virtualpath.Contains("?") && addparams.Length > 0)
            virtualpath = virtualpath + "&" + addparams;

        return "/" + virtualpath;
    }

    protected static string BuildAdditionalParams(object additionalParams)
    {
        if (additionalParams == null)
            return string.Empty;

        StringBuilder sb = new StringBuilder();
        Type type = additionalParams.GetType();
        PropertyInfo[] props = type.GetProperties();

        Action<string, string> addProperty = (name, value) =>
        {
            if (sb.Length > 0)
                sb.Append("&");
            sb.Append(name);
            sb.Append("=");
            sb.Append(value);
        };

        foreach (PropertyInfo prop in props)
        {
            var simplevalue = prop.GetValue(additionalParams, null);
            if (simplevalue != null)
            {
                Type propertyType = prop.PropertyType;
                if (Nullable.GetUnderlyingType(propertyType) != null)
                {
                    propertyType = Nullable.GetUnderlyingType(propertyType);
                }

                if (propertyType.IsEnum) 
                {
                    addProperty(prop.Name, ((int)simplevalue).ToString());
                }
                else if (propertyType.IsArray && propertyType != typeof(string))
                {
                    foreach (var val in prop.GetValue(additionalParams, null) as IEnumerable)                        
                        addProperty(prop.Name, val.ToString());                                                    
                }                    
                else
                {
                    if (!string.IsNullOrEmpty(simplevalue.ToString()))
                        addProperty(prop.Name, simplevalue.ToString());                        
                }
            }
        }
        return sb.ToString();
    }

Эта функция создаст полный путь к вашему маршруту и ​​добавит значения в объект AdditionalParams в качестве данных строки запроса. Это может обрабатывать массивы, перечисления, обнуляемые значения и другие типы, выполняя их метод ToString.

Надеюсь, это поможет!

...