我有以下模型:
public class ConfigurationPolicyModel
{
public ConfigurationPolicyModel()
{
Properties = new List<Property>();
}
public List<Property> Properties { get; set; }
public class Property
{
public Property()
{
Value = new List<ValueItem>();
}
public List<ValueItem> Value { get; set; }
public class ValueItem
{
public string Data { get; set; }
}
}
}
简化后的控制器如下:
[HttpPost]
public ActionResult EditPolicy(ConfigurationPolicyModel model)
{
foreach (var prop in model.Properties)
{
var n = prop.Value.Count; // The problem is here: prop.Value is empty
}
...
}
问题上下文如下:
- EditPolicy 视图足够复杂,其中 Knockout.JS 用于动态添加/删除值项,输入元素如下所示:
<input class="text-box single-line" type="text" data-bind="value: Data" name="Properties[@i].ValueItem" />
但是在提交表单时,JavaScript 代码会更新名称属性以具有正确的名称,例如Properties[0].Value[0].Data
:
for (var i = 0; i < viewModel.properties().length; ++i)
{
var valueItems = $('input[name="Properties[' + i + '].ValueItem"]');
for (var j = 0; j < valueItems.length; ++j)
{
$(valueItems[j]).attr("name", "Properties[" + i + "].Value[" + j + "].Data");
}
}
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
)自定义模型活页夹来观察字段实际上确实到达了模型活页夹, - 是的,它们确实如此。 - 但是当默认绑定器创建模型的实例时 -
Property
实例的列表中没有项目Value
。 - 还有最奇怪的一点:这个问题时有发生,而且似乎取决于价值项的数量。如果一个属性有一个值项,则
Value
列表可能会被填充,但如果有六个值项,则不会向列表中插入任何项Value
。
有人可以建议如何解决这个问题吗?非常感谢您提前。