2015-06-14 75 views
2

出於某種原因,當我將此視圖模型發回控制器並添加到模型中進行綁定時,它最終變爲null。我正在使用的應用程序是一個龐大的應用程序。此外,我還沒有寫出太多的代碼,所以這個模型非常龐大,所以我只需添加重要的部分,但其他屬性是否可以阻止模型綁定?MVC3 POST模型綁定不適用於特定的複雜模型

我知道它一直在工作,但在最後一點點它不開始。也許它甚至不是模型的東西,只是喜歡一些幫助調試它。

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

此外,被髮送的值回螢火蟲是:

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

你需要證明你的觀點 - 如果沒有約束,最常見的原因是因爲視圖不正確 –

+0

謝謝@StephenMuecke我已經更新了它的問題以及通過調試工具發送的表單數據 – Adam

+1

爲什麼在POST操作中有'applicationId'參數?此外,刪除與問題無關的代碼('SqsChosenCategoryViewModel'和GET Categories操作)。 – ataravati

回答

1

所以我只是要回答我自己的問題,儘管它沒有像其他方式那樣解決。

我相信,當你鍵入模型並綁定它時,它在後臺使用「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); 
     } 
    } 
} 

從這篇文章摘自:How to find the exceptions/errors when TryUpdateModel fails to update model in asp.net mvc 3