Asp.net mvc 3 为什么asp.net mvc模型是活页夹生成系统.string[]

Asp.net mvc 3 为什么asp.net mvc模型是活页夹生成系统.string[],asp.net-mvc-3,Asp.net Mvc 3,我有一个表单,它将一个有效的对象字典发布到我的控制器操作中。所以我们得到了一个IEnumerable 当我查看Request.Form集合时,我看到了我所期望的: [1] "Attributes[0].Name" string [2] "Attributes[0].Value" string [3] "Attributes[1].Name" string [4] "Attributes[1].Value" string [5] "Att

我有一个表单,它将一个有效的对象字典发布到我的控制器操作中。所以我们得到了一个
IEnumerable

当我查看Request.Form集合时,我看到了我所期望的:

    [1] "Attributes[0].Name"    string
    [2] "Attributes[0].Value"   string
    [3] "Attributes[1].Name"    string
    [4] "Attributes[1].Value"   string
    [5] "Attributes[2].Name"    string
    [6] "Attributes[2].Value"   string
但是,当我尝试获取其中一个
editThemeatDistributeModel
的值时,它不是我所期望的简单类型,而是一个字符串数组:

-   Value   {string[1]} object {string[]}
                [0] "#ffffff"   string

我可以直接使用Request.Forms集合来解决这个问题,但我只是想了解这种行为。

默认情况下,http请求中的所有帖子都是字符串。因为您引用的是对象而不是类型化对象,所以它默认为字符串,因为来自浏览器的数据是字符串。如果您希望它不是字符串,我建议您键入您的对象,或者您可以为
editThemeatDistributeModel

创建自己的模型绑定器是的,我知道,但这不是问题所在。问题是,当我们向模型绑定器传递一组对象时,为什么模型绑定器会生成一个字符串数组
string[]
。因为默认情况下,对于给定的post值,可以为同一名称包含多个值
id=1&id=2&id=3
因为您并不是特别要求一个
string
而是一个
object
模型绑定器假设它可以是一个数组,因为它不能直接将其转换为类型。数组创建是模型绑定器的最后一次调用,因为它基本上无法确定您真正想要的是什么。我想它这样做只是为了安全。你可以按照源代码中的模型绑定器代码,看看它为什么这样做。不久前,我这样做是为了回答我在创建自动模型绑定器时遇到的一个类似问题。查看
BindSimpleModel
(实际转换在ValueProviderResult中)
-   Value   {string[1]} object {string[]}
                [0] "#ffffff"   string