当我回发给我的控制器时,我的模型的所有值都是null

我已经把模型切回到了一个领域:

//模型

public class LetterViewModel { public string LetterText; } 

//控制器

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

//视图

 @model Test.Models.LetterViewModel @{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Title = "Create a Letter"; } @using (Html.BeginForm()) { <div id="Bottom"> @Html.TextAreaFor(m => m.LetterText) <input type="submit" value="Ok" class="btn btn-default" /> </div> } 

当我检查开发工具中的networking标签时,显示input的值正在被包含在请求中。 但是,当HttpPost控制器被触发时,该字段为空。

DefaultModelBinder不设置字段的值,只有属性。 你需要改变你的模型以包含属性

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

在没有选项将字段转换为属性的情况下,也可以使用自定义联编程序而不是默认联编程序。

循环表单input并使用reflection进行设置。 MemberInformation是我的class,但你可以只使用FieldInfo

这不会做一个对象图,但如果我需要这种能力,我会加强我的答案。 foreach的元组使用c#7.0。 它还假定您在此POST之前保存了您的对象从以前的GET

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