MVC3 POST 模型绑定不适用于特定的复杂模型

本文关键字:模型 复杂 不适用 POST 绑定 MVC3 适用于 | 更新日期: 2023-09-27 17:56:16

出于

某种原因,当我将此视图模型发布回控制器并添加模型进行绑定时,它最终为 null。我正在使用的应用程序是一个巨大的应用程序。此外,我没有编写太多代码,因此此模型很大,因此我只会添加重要的部分,但是其他属性会阻止模型绑定吗?

我确实知道它一直在工作,但在最后一点点它开始没有。也许它甚至不是模型的东西,只是希望得到一些帮助来调试它。

开机自检操作:

[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
        }
    }
}

此外,在火虫中发回的值是:

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; }
}

MVC3 POST 模型绑定不适用于特定的复杂模型

所以我只想回答我自己的问题,尽管它没有解决,因为有另一种方法可以做到这一点。

我相信当你输入提示模型并绑定它时,它在后台使用"TryUpdateModel()",所以我只是在控制器中调用它,出于某种原因它起作用了。不确定我这样做是否会错过其他任何东西,但它对我有用。

此外,您还可以通过以下方式调试可能出现的问题:

var model = new ViewModel();
 var isSuccess = TryUpdateModel(model);
 if (!isSuccess)
 {
     foreach (var modelState in ModelState.Values)
     {
        foreach (var error in modelState.Errors)
        {
           Debug.WriteLine(error.ErrorMessage);
        }
     }
 }

摘自这篇文章:当 TryUpdateModel 无法更新 asp.net mvc 3 中的模型时,如何查找异常/错误