【发布时间】:2015-08-30 09:26:39
【问题描述】:
由于某种原因,当我将此视图模型发布回控制器并添加模型以进行绑定时,它最终为空。我正在使用的应用程序是一个庞大的应用程序。另外我没有写太多代码,所以这个模型很大,所以我只添加重要的部分,但是其他属性会阻止模型绑定吗?
我知道它一直在工作,但在最后一点开始没有。也许它甚至与模型无关,只是希望有人帮助调试它。
POST 动作:
[HttpPost]
public ActionResult Categories(int applicationId, SqsApplicationViewModel model)
{
// Save away the ids they chose
_sqsApplicationCategoryService.SaveCategories(applicationId, model.Display_Categories.Where(i => i.Selected).Select(i => i.CategoryId).ToList());
// Complete the step
_sqsApplicationStepService.CompleteStep(applicationId, SqsStep.Categories);
return RedirectToAction("Documents");
}
查看模型:
public class SqsApplicationViewModel : IMappable
{
public int Id { get; set; }
public int SupplierId { get; set; }
public int? SqsApprovalLevelId { get; set; }
// Other properties .....
public List<SqsChosenCategoryViewModel> Display_Categories { get; set; }
// Other properties .....
}
public class SqsChosenCategoryViewModel
{
public int CategoryId { get; set; }
public string Name { get; set; }
public string CategoryAmountString { get; set; }
public bool Selected { get; set; }
public IList<SqsDocumentComplianceViewModel> Documents { get; set; }
}
查看:
@using (Html.BeginForm())
{
@Html.HiddenFor(m => m.Id)
@if (Model.Display_Categories != null && Model.Display_Categories.Count() > 0)
{
for (var i = 0; i < Model.Display_Categories.Count; i++)
{
@Html.HiddenFor(m => m.Display_Categories[i].CategoryId)
@Html.CheckBoxFor(m => m.Display_Categories[i].Selected)
@Model.Display_Categories[i].Name
}
}
}
此外,在 firebug 中发回的值是:
Id:1061
Display_Categories[0].CategoryId:4
Display_Categories[0].Selected:true
Display_Categories[0].Selected:false
Display_Categories[1].CategoryId:1
Display_Categories[1].Selected:false
Display_Categories[2].CategoryId:2
Display_Categories[2].Selected:false
Display_Categories[3].CategoryId:3
Display_Categories[3].Selected:false
Display_Categories[4].CategoryId:6
Display_Categories[4].Selected:true
Display_Categories[4].Selected:false
Display_Categories[5].CategoryId:8
Display_Categories[5].Selected:false
Display_Categories[6].CategoryId:10
Display_Categories[6].Selected:false
Display_Categories[7].CategoryId:7
Display_Categories[7].Selected:false
Display_Categories[8].CategoryId:9
Display_Categories[8].Selected:false
Display_Categories[9].CategoryId:11
Display_Categories[9].Selected:false
Display_Categories[10].CategoryId:5
Display_Categories[10].Selected:true
Display_Categories[10].Selected:false
-------------编辑----
我尝试使用以下测试模型并且效果很好。模型中的另一个属性是否有可能阻碍绑定?我也在其中添加了一些随机的,它仍然有效。
public class TestViewModel
{
public int Id { get; set; }
public IList<TestSubViewModel> Display_Categories { get; set; }
public string TestProp { get { return "asdfasdfasdf"; } }
public TestSubViewModel TestGetFirst { get { return this.Display_Categories.FirstOrDefault(); } }
}
public class TestSubViewModel
{
public int CategoryId { get; set; }
public string Name { get; set; }
public string CategoryAmountString { get; set; }
public bool Selected { get; set; }
public IList<SqsDocumentComplianceViewModel> Documents { get; set; }
}
【问题讨论】:
-
你需要展示你的视图——如果它没有绑定,最常见的原因是视图不正确
-
谢谢@StephenMuecke 我已经用它更新了这个问题,也用调试工具发送的表单数据
-
为什么在 POST 操作中有
applicationId参数?此外,删除与问题无关的代码(SqsChosenCategoryViewModel和 GET Categories 操作)。 -
模型为
null(与模型属性相反)的最常见原因是您为模型的复杂属性包含了输入,或者您的模型中有一个属性名为Model的模型(并包含它的输入)。您发布的数据具有正确的名称/值对并且应该绑定。我建议您注释掉表单标签之间的所有视图代码(提交按钮除外),然后通过一次取消注释一个表单控件来进行测试 -
@ataravati,那是因为 OP 使用的是
@Html.CheckBoxFor(),它会生成一个复选框和一个隐藏的输入。如果选中该复选框,它将发布true和false,而不是仅发布false。DefaultModelBinder忽略第二个值(如果存在)。
标签: c# asp.net-mvc asp.net-mvc-3 model-binding