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

asp.net-mvc – 向RouteValueDictionary添加复杂类型的数组

发布时间:2020-12-16 00:12:28 所属栏目:asp.Net 来源:网络整理
导读:我想知道是否有一种优雅的方法可以将一组复杂类型添加到RouteValueDictionary或兼容类型? 例如,如果我有一个类和一个动作: public class TestObject{ public string Name { get; set; } public int Count { get; set; } public TestObject() { } public Te
我想知道是否有一种优雅的方法可以将一组复杂类型添加到RouteValueDictionary或兼容类型?

例如,如果我有一个类和一个动作:

public class TestObject
{
    public string Name { get; set; }
    public int Count { get; set; }

    public TestObject()
    {
    }

    public TestObject(string name,int count)
    {
        this.Name = name;
        this.Count = count;
    }
}

public ActionResult Test(ICollection<TestObjects> t)
{
    return View();
}

然后我知道如果我通过URL调用此操作“/Test?t[0].Name=Oneu0026amp;t[0].Count=1u0026amp;t[1].Name=Twou0026amp;t[1].Count= 2“MVC会自动将这些查询字符串参数映射回ICollection类型.但是,如果我使用Url.Action()在某处手动创建链接,并且我想传递参数的RouteValueDictionary,当我向RouteValueDictionary添加ICollection时,Url.Action只是将其呈现为类型,如& T = System.Collections.Generic.List.

例如:

RouteValueDictionary routeValDict = new RouteValueDictionary();
List<TestObject> testObjects = new List<TestObject>();

testObjects.Add(new TestObject("One",1));
testObjects.Add(new TestObject("Two",2));
routeValDict.Add("t",testObjects);

// Does not properly create the parameters for the List<TestObject> collection.
string url = Url.Action("Test","Test",routeValDict);

有没有办法让它自动将该集合呈现为MVC也理解如何映射的格式,或者我必须手动执行此操作?

我错过了什么,为什么他们会这样做,所以这个美丽的映射存在于一个Action中,但没有提供一种手动反向创建URL的方法?

解决方法

我也遇到了这个问题,并使用了Zack的代码,但发现了一个错误.如果IEnumerable是一个字符串数组(string []),则存在问题.所以我认为我会分享我的扩展版本.
public static RouteValueDictionary ToRouteValueDictionaryWithCollection(this RouteValueDictionary routeValues)
    {
        var newRouteValues = new RouteValueDictionary();

        foreach(var key in routeValues.Keys)
        {
            object value = routeValues[key];

            if(value is IEnumerable && !(value is string))
            {
                int index = 0;
                foreach(object val in (IEnumerable)value)
                {
                    if(val is string || val.GetType().IsPrimitive)
                    {
                        newRouteValues.Add(String.Format("{0}[{1}]",key,index),val);
                    }
                    else
                    {
                        var properties = val.GetType().GetProperties();
                        foreach(var propInfo in properties)
                        {
                            newRouteValues.Add(
                                String.Format("{0}[{1}].{2}",index,propInfo.Name),propInfo.GetValue(val));
                        }
                    }
                    index++;
                }
            }
            else
            {
                newRouteValues.Add(key,value);
            }
        }

        return newRouteValues;
    }

(编辑:李大同)

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

    推荐文章
      热点阅读