Quando eu postar de volta no meu controlador, todos os valores do meu modelo são nulos

Eu cortei o modelo de volta para um campo:

//Modelo

public class LetterViewModel { public string LetterText; } 

//Controlador

 public ActionResult Index() { var model = new LetterViewModel(); model.LetterText = "Anything"; return View(model); } [HttpPost] public ActionResult Index(LetterViewModel model) { //model.LetterText == null return View(model); } 

//Visão

 @model Test.Models.LetterViewModel @{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Title = "Create a Letter"; } @using (Html.BeginForm()) { 
@Html.TextAreaFor(m => m.LetterText)
}

Quando eu marquei a aba Rede nas ferramentas de desenvolvimento, está mostrando que o valor inserido está sendo incluído na solicitação. No entanto, quando o controlador HttpPost é triggersdo, o campo está vazio.

O DefaultModelBinder não define o valor de campos, apenas propriedades. Você precisa mudar seu modelo para include propriedades

 public class LetterViewModel { public string LetterText { get; set; } // add getter/setter } 

Você também pode usar um fichário personalizado em vez do fichário padrão nos casos em que não tem a opção de converter campos em propriedades.

Faça um loop pelas inputs do formulário e configure-as usando reflection. MemberInformation é minha class, mas você pode usar o FieldInfo .

Isso não faz um gráfico de objects, mas se eu precisar dessa habilidade, melhorarei minha resposta. A tupla no foreach usa c # 7.0. Também presume que você salvou seu object do GET anterior antes deste POST .

 using CommonBusinessModel.Metadata; using GHCOMvc.Controllers; using System; using System.Linq; using System.Web.Mvc; namespace AtlasMvcWebsite.Binders { public class FieldModelBinder : DefaultModelBinder { // this runs before any filters (except auth filters) public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var form = controllerContext.HttpContext.Request.Form; Type type = typeof(GHCOBusinessModel.GHCOPPAType); AtlasKernelBusinessModel.VersionedObject instance = PolicyController.Policy; foreach ((var value, var member) in (from string input in form let fi = type.GetField(input) where fi != null let mi = new MemberInformation(fi, instance) where !mi.ReadOnly select (form[input], mi))) member.SetValue(value); return instance; } } } 

Você precisa adicionar [FromBody] antes do parâmetro para Action

 [HttpPost] public ActionResult Index([FromBody]LetterViewModel model) { //model.LetterText == null return View(model); }