当我回发给我的控制器时,我的模型的所有值都是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; } } }