C# 模型绑定器不填充嵌套列表中的项目

C# 模型绑定器不填充嵌套列表中的项目,c#,razor,asp.net-mvc-4,model-binding,C#,Razor,Asp.net Mvc 4,Model Binding,我有以下型号: 公共类配置策略模型 { 公共配置策略模型() { 属性=新列表(); } 公共列表属性{get;set;} 公共类财产 { 公共财产() { 值=新列表(); } 公共列表值{get;set;} 公共类价值项目 { 公共字符串数据{get;set;} } } } 简化控制器如下所示: Id=00000000-0000-0000-0000-000000000000&Level=Platform&Name=SmsPolicy&InheritanceLevel

我有以下型号:

公共类配置策略模型
{
公共配置策略模型()
{
属性=新列表();
}
公共列表属性{get;set;}
公共类财产
{
公共财产()
{
值=新列表();
}
公共列表值{get;set;}
公共类价值项目
{
公共字符串数据{get;set;}
}
}
}
简化控制器如下所示:

Id=00000000-0000-0000-0000-000000000000&Level=Platform&Name=SmsPolicy&InheritanceLevels[0].Level=SafeCenter&InheritanceLevels[0].InheritanceType=Force&InheritanceLevels[1].Level=TeamSafe&InheritanceLevels[1].InheritanceType=Force&Properties[0].Name=Providers&Properties[0].ValueIsSequence=True&Properties[0].Value[0].Data=O2&Properties[0].Value[1].Data=Telecom&Properties[0].Value[2].Data=&Properties[0].Value[3].Data=&Properties[0].Minimum=&Properties[0].Maximum=&Targets[0].Level=Platform&Targets[0].Name=Platform&Targets[0].Selected=true&Targets[0].Selected=false&Targets[1].Level=SafeCenter&Targets[1].Name=SafeCenters&Targets[1].Selected=true&Targets[1].Selected=false&Targets[1].Items[0].Level=SafeCenter&Targets[1].Items[0].OwnerId=7292f9aa-b168-43ab-83a7-db193599d02f&Targets[1].Items[0].Name=Google+Inc.&Targets[1].Items[0].Selected=true&Targets[1].Items[0].Selected=false&Targets[1].Items[1].Level=SafeCenter&Targets[1].Items[1].OwnerId=6c481d66-0ece-4269-8256-c02d3b8c5109&Targets[1].Items[1].Name=SC11&Targets[1].Items[1].Selected=true&Targets[1].Items[1].Selected=false&Targets[1].Items[2].Level=SafeCenter&Targets[1].Items[2].OwnerId=9afd1968-6742-435d-919e-36068ff4b235&Targets[1].Items[2].Name=SC2&Targets[1].Items[2].Selected=true&Targets[1].Items[2].Selected=false&Targets[1].Items[3].Level=SafeCenter&Targets[1].Items[3].OwnerId=995813e1-91d4-4fad-bf10-fbafa0354cbb&Targets[1].Items[3].Name=SC4&Targets[1].Items[3].Selected=true&Targets[1].Items[3].Selected=false&Targets[1].Items[4].Level=SafeCenter&Targets[1].Items[4].OwnerId=acbd68a8-cb9b-4e50-8eeb-59b374fedae0&Targets[1].Items[4].Name=SC5&Targets[1].Items[4].Selected=true&Targets[1].Items[4].Selected=false&Targets[2].Level=TeamSafe&Targets[2].Name=TeamSafes&Targets[2].Selected=true&Targets[2].Selected=false
[HttpPost]
公共行动结果编辑策略(配置策略模型)
{
foreach(model.Properties中的var属性)
{
var n=prop.Value.Count;//问题在于:prop.Value为空
}
...
}
问题背景如下:

  • EditPolicy视图非常复杂,其中Knockout.JS用于动态添加/删除值项,输入元素如下所示:
Fiddler中HTTP请求的表单数据如下所示(在WebForms模式下):

HTTP请求的原始有效负载如下所示:

Id=00000000-0000-0000-0000-000000000000&Level=Platform&Name=SmsPolicy&InheritanceLevels[0].Level=SafeCenter&InheritanceLevels[0].InheritanceType=Force&InheritanceLevels[1].Level=TeamSafe&InheritanceLevels[1].InheritanceType=Force&Properties[0].Name=Providers&Properties[0].ValueIsSequence=True&Properties[0].Value[0].Data=O2&Properties[0].Value[1].Data=Telecom&Properties[0].Value[2].Data=&Properties[0].Value[3].Data=&Properties[0].Minimum=&Properties[0].Maximum=&Targets[0].Level=Platform&Targets[0].Name=Platform&Targets[0].Selected=true&Targets[0].Selected=false&Targets[1].Level=SafeCenter&Targets[1].Name=SafeCenters&Targets[1].Selected=true&Targets[1].Selected=false&Targets[1].Items[0].Level=SafeCenter&Targets[1].Items[0].OwnerId=7292f9aa-b168-43ab-83a7-db193599d02f&Targets[1].Items[0].Name=Google+Inc.&Targets[1].Items[0].Selected=true&Targets[1].Items[0].Selected=false&Targets[1].Items[1].Level=SafeCenter&Targets[1].Items[1].OwnerId=6c481d66-0ece-4269-8256-c02d3b8c5109&Targets[1].Items[1].Name=SC11&Targets[1].Items[1].Selected=true&Targets[1].Items[1].Selected=false&Targets[1].Items[2].Level=SafeCenter&Targets[1].Items[2].OwnerId=9afd1968-6742-435d-919e-36068ff4b235&Targets[1].Items[2].Name=SC2&Targets[1].Items[2].Selected=true&Targets[1].Items[2].Selected=false&Targets[1].Items[3].Level=SafeCenter&Targets[1].Items[3].OwnerId=995813e1-91d4-4fad-bf10-fbafa0354cbb&Targets[1].Items[3].Name=SC4&Targets[1].Items[3].Selected=true&Targets[1].Items[3].Selected=false&Targets[1].Items[4].Level=SafeCenter&Targets[1].Items[4].OwnerId=acbd68a8-cb9b-4e50-8eeb-59b374fedae0&Targets[1].Items[4].Name=SC5&Targets[1].Items[4].Selected=true&Targets[1].Items[4].Selected=false&Targets[2].Level=TeamSafe&Targets[2].Name=TeamSafes&Targets[2].Selected=true&Targets[2].Selected=false
  • 当表单发布到服务器时,表单数据实际上包含这样的字段,Fiddler会确认这一点。此外,我(通过
    ModelBinderAttribute
    )指定了自定义模型绑定器,以观察字段是否实际到达了模型绑定器,-是的,它们确实到达了
  • 但是,当默认绑定器创建模型的实例时,
    属性
    实例的
    列表中没有任何项
  • 最奇怪的一点是:这个问题一次又一次地出现,而且似乎取决于价值项目的数量。如果属性有一个值项,则可能会填充
    列表,但如果有六个值项,则不会在
    列表中插入任何项

有人能告诉我如何解决这个问题吗?事先非常感谢

确保编号是连续的。 跳过的每个Id都会导致模型中不填充所有较大的Id

具体来说,我在一个MVC网站上做了一个类似的测试,并注意到:

  • 当我在客户机上有IDs1、2、3、4、5、6、7时,所有元素都正确地填充在模型中
  • 对于ID 1、2、3、5、6、7,只填充元素1、2和3(5、6和7由于缺少4而丢失)

以下各项工作正常:

@using (Html.BeginForm())
{
    <input type="text" name="Properties[0].Value[0].Data" value="O2" />
    <input type="text" name="Properties[0].Value[1].Data" value="Telecom" />
    <input type="text" name="Properties[0].Value[2].Data" value="" />
    <input type="text" name="Properties[0].Value[3].Data" value="" />

    <button type="submit">OK</button>
}
以下有效负载通过导线发送:

Properties[0].Value[0].Data = O2
Properties[0].Value[1].Data = Telecom
Properties[0].Value[2].Data =
Properties[0].Value[3].Data =

因此,如果这对您不起作用,可能还有其他原因,例如自定义模型绑定器会干扰默认约定,或者您的请求负载看起来与此处所示不符。

除了问题,为什么嵌套类ValueItem?能否显示EditPolicy视图?@testCoder我已添加EditPolicy视图的说明。如果仍然没有足够的详细信息,请通知。@Asif嵌套类型被封装在相应的模型类中,以使名称空间更清晰。模型绑定器支持类型嵌套。您能显示您的Fiddler请求后有效负载转储吗?或者,如果您使用FireBug或Chrome开发者工具栏,您可以直接从“网络”选项卡获取。是的,索引是连续的,没有任何间隙。我添加了Fiddler屏幕截图来演示这一点。我添加了导致绑定失败的HTTP请求的有效负载。它具有与值项完全相同的名称=值对。我们不使用任何自定义模型绑定器,只使用默认模型绑定器。
[HttpPost]
public ActionResult EditPolicy(ConfigurationPolicyModel model)
{
    return View();
}
Properties[0].Value[0].Data = O2
Properties[0].Value[1].Data = Telecom
Properties[0].Value[2].Data =
Properties[0].Value[3].Data =