每当我提交表单时,传递给控制器的模型都是NULL.我花了很长时间看这个.我想我在这里缺少一些基本的东西.
@model VisitorPortal.Models.ReinviteVisitorModel @using (Html.BeginForm("CreateMeeting","Home",FormMethod.Post,new { @class = "form-horizontal",role = "form" })) { @Html.AntiForgeryToken() <h3>Reinvitation Details</h3> <div>The information entered below will be sent to the visitors email address @Model.Info.Email</div> <hr /> @Html.ValidationSummary("",new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(m => m.NewMeeting.Title,new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.NewMeeting.Title,new { @class = "form-control" }) </div> </div> <div class="form-group"> @Html.LabelFor(m => m.NewMeeting.StartTime,new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.NewMeeting.StartTime,new { @class = "datetimepicker form-control" }) </div> </div> <div class="form-group"> @Html.LabelFor(m => m.NewMeeting.EndTime,new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.NewMeeting.EndTime,new { @class = "datetimepicker form-control" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> @Html.HiddenFor(m => m.NewMeeting.SubjectId,new { @Value = Model.Info.SubjectId }) <input type="submit" class="btn btn-default" value="Send Invite" /> </div> </div> }
该模型是:
public class Meeting { [Key] public int Id { get; set; } public string SubjectId { get; set; } [required] [Display(Name = "Reason for invitation")] public string Title { get; set; } [required] [Display(Name = "Start Time")] [DataType(DataType.Time)] public DateTime StartTime { get; set; } [required] [Display(Name = "End Time")] [DataType(DataType.Time)] public DateTime EndTime { get; set; } public string HostEmail { get; set; } public string HostMobile { get; set; } } public class MeetingsDBContext: DbContext { public DbSet<Meeting> Meetings { get; set; } } public class ReinviteVisitorModel { public Visitor Info; public Meeting NewMeeting; public List<Meeting> Meetings; }
Controller的行动是:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult CreateMeeting(Meeting meeting) { return RedirectToAction("ReinviteVisitor2",new { visitorId = meeting.SubjectId }); }
我在模型中有字段,例如Id,我期望数据库填充我将在动作CreateMeeting()中编写的内容.是否必须在表单中使用模型中的所有字段?
解决方法
您视图中的模型是typeof ReinviteVisitorModel,这意味着自发布ReinviteVisitorModel以来POST方法的签名必须匹配
[HttpPost] [ValidateAntiForgeryToken] public ActionResult CreateMeeting(ReinviteVisitorModel model)
或者,您可以使用BindAttribute的Prefix属性从您要发布的表单控件的名称中删除NewMeeting前缀.
public ActionResult CreateMeeting([Bind(Prefix="NewMeeting")]Meeting model)
附注:从隐藏输入中删除新的{@Value = Model.Info.SubjectId},然后在将模型传递给视图之前在GET方法中设置NewMeeting.SubjectId的值.