Quando rinvio al mio controller tutti i valori per il mio modello sono nulli

Ho riportato il modello a un campo:

//Modello

public class LetterViewModel { public string LetterText; } 

// controller

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

//vista

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

Quando controllo la scheda Rete negli strumenti di sviluppo, indica che il valore inserito è incluso nella richiesta. Tuttavia, quando viene triggersto il controller HttpPost, il campo è vuoto.

DefaultModelBinder non imposta il valore dei campi, solo le proprietà. È necessario modificare il modello per includere le proprietà

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

È anche ansible utilizzare un raccoglitore personalizzato anziché il raccoglitore predefinito nei casi in cui non si ha la possibilità di convertire i campi in proprietà.

Passa attraverso gli input del modulo e impostali utilizzando il reflection. MemberInformation è la mia class ma puoi semplicemente utilizzare FieldInfo .

Questo non fa un grafico ad oggetti, ma se ho bisogno di questa abilità migliorerò la mia risposta. La tupla in foreach utilizza c # 7.0. Presuppone anche che tu abbia salvato il tuo object dal precedente GET prima di questo 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; } } } 

È necessario aggiungere [FromBody] prima del parametro all’azione

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