加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 如何将int数组传递给RouteValueDictionary

发布时间:2020-12-16 04:23:33 所属栏目:asp.Net 来源:网络整理
导读:我需要生成这个URL:http:// localhost:3178 / Reports /?GroupId = 1211 GroupId = 1237 我尝试着: var routeData = new RouteValueDictionary();routeData.Add("GroupId","1,2"); 得到:GroupId = 1,2 要么 routeData.Add("GroupId","1");routeData.Ad
我需要生成这个URL:http:// localhost:3178 / Reports /?GroupId = 1211& GroupId = 1237

我尝试着:

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

得到:GroupId = 1,2

要么

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

获取:已添加具有相同键的项目

乃至

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

得到:?GroupId [0] = 1& GroupId [1] = 2

有可能以某种方式修复我的问题?

解决方法

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方法来处理数组,枚举,可空值和其他类型.

希望这可以帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读