2013-09-05 3 views
2

Я полностью озадачен тем, как эта простая концепция не работает. У меня есть ViewModel, контроллер и вид ...ViewModel properties stay null on HttpPost

Это мой основной ViewModel

public class CreateProfessionalEducationViewModel 
{ 

    public Models.ProfessionalEducation ProfessionalEducation; 

    public int ConsultantId; 

    public CreateProfessionalEducationViewModel() {} // parameterless constr 

} 

Это мои 2 метода контроллера

public ActionResult Create(int id) 
    { 
     var viewModel = new CreateProfessionalEducationViewModel 
     { 
      ConsultantId = id 
     }; 

     return View(viewModel); 
    } 

    // 
    // POST: /ProfessionalEducation/Create 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create(CreateProfessionalEducationViewModel collection) 
    { 
     if (ModelState.IsValid) 
     { 
      //db.ProfessionalEducations.Add(professionaleducation); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(); 
    } 

и мое мнение ...

По какой-то странной причине мой консультант-консультант 0 и ProfessionalEducation имеет значение null в моей ViewModel, когда отправляется обратно в t он HttpPost Создайте метод в моем контроллере.

Это должно быть настолько простым, что я забываю?

Спасибо заранее!

+0

Вы вызываете свое действие с помощью '.../Create/1' или просто' .../Create/' –

+1

Не должны ли эти поля быть свойствами вместо (get; set;}? Я не думаю, что ModelBinder будет связываться с равными полями, они должны быть свойствами. –

+0

Правильно, это была моя проблема. –

ответ

1

Основная проблема заключается в том, что loony, который является DefaultModelBinder (что реконструирует viewmodels от HttpFormCollection) работает над свойствами, а не переменными.

И если я не ошибаюсь, я полагаю, что связующее устройство по умолчанию не работает так хорошо, если вы используете внутренние объекты, подобные этому в своей модели просмотра, и получаете доступ к их свойствам непосредственно в представлении.

Попробуйте что-то вроде этого:

public class CreateProfessionalEducationViewModel 
{ 
    public int ConsultantId { get; set; } 

    public int ProfessionalEducationYear { get; set; } 

    public string ProfessionalEducationTitle { get; set; } 
} 

И для зрения конечно

@model Axxes_Virtual_Resume_MVC.ViewModel.ProfessionalEducation.CreateProfessionalEducationViewModel 
@using (Html.BeginForm("Create", "ProfessionalEducation")) { 
@Html.AntiForgeryToken() 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>ProfessionalEducation</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.ProfessionalEducationYear) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.ProfessionalEducationYear) 
     @Html.ValidationMessageFor(model => model.ProfessionalEducationYear) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.ProfessionalEducationTitle) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.ProfessionalEducationTitle) 
     @Html.ValidationMessageFor(model => model.ProfessionalEducationTitle) 
    </div> 
    @Html.HiddenFor(model => model.ConsultantId) 
    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 

Как правило старается избегать ссылок на объекты модели в вашем ViewModels (но это просто правило дизайна)

0

Атрибут атрибута тегов должен быть «ProfessionalEducation.Year» или «ProfessionalEducation.Title», чтобы работа по умолчанию была обязательной. Так что используйте это:

@Html.TextBox("ProfessionalEducation.Year") 

вместо

@Html.EditorFor(model => model.ProfessionalEducation.Year) 

и то же самое для права собственности. Вы можете прочитать больше о ASP.NET MVC модель привязки в этот полезный пост: http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx

+0

Я использовал @ Html.EditorFor (model => model.ProfessionalEducation.Year), и при проверке источника он автоматически дал атрибут Name Правильное значение :) –

+0

И имея правильное имя, все же привязка не работает? –

+0

Не протестировали ваш подход, но использование свойств вместо полей в моем ViewModel устранило проблему. –

1

Используя свойства вместо полей в моей ViewModel установил ее для меня.

Спасибо всем за их усилия.

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