2015-06-14 6 views
2

По какой-то причине, когда я отправляю эту модель представления обратно контроллеру и добавляю в модель для привязки, он заканчивается нулевым. Приложение, с которым я работаю, является массовым. Кроме того, я не написал большую часть кода, поэтому эта модель массивна, поэтому я просто добавлю те части, которые важны, но могут ли другие свойства препятствовать привязке модели?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 

------------- EDIT ----------------

Я попытался использовать следующие тестовые модели, и она работала. Возможно ли, что другое свойство в Модели может препятствовать связыванию? Я добавил некоторые случайные в них тоже, и он все еще работал.

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

Почему у вас есть параметр 'applicationId' в действии POST? Кроме того, удалите код, который не имеет отношения к вопросу («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

Смежные вопросы