2016-07-12 3 views
2

Immer wenn ich das Formular absende, ist das Modell in den Controller übergeben ist NULL. Ich habe ewig daran gedacht. Ich denke, ich vermisse hier etwas Grundlegendes.Modell ist immer NULL auf Formularpost zum Controller

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

Das Modell ist:

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

Die Controller-Aktion ist:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult CreateMeeting(Meeting meeting) 
    { 
     return RedirectToAction("ReinviteVisitor2", "Home", new { visitorId = meeting.SubjectId }); 
    } 

Ich habe Felder im Modell wie Id, die ich die Datenbank erwarten zu füllen, die ich war werde in der Aktion CreateMeeting() schreiben. Müssen alle Felder im Modell im Formular verwendet werden?

+0

Sie zu einer anderen Aktion Umleitung 'ReinviteVisitor2', PLZ seinen Code hinzufügen. Wie lautet der Dateiname der Ansicht? – akazemis

+0

Das Modell, das Sie übergeben, und das Modell, das Sie verwendet haben, sind unterschiedlich, weshalb es null zurückgibt. – denchu

Antwort

5

Das Modell Ihrer Ansicht nach ist typeof ReinviteVisitorModel, welche die Unterschrift der POST-Methode bedeutet, da Ihre Buchung ReinviteVisitorModel

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult CreateMeeting(ReinviteVisitorModel model) 

alternativ können Sie die Prefix Eigenschaft BindAttribute verwenden übereinstimmen muß den NewMeeting Präfix von den Namen strippen des Formulars steuert Ihre Buchung.

public ActionResult CreateMeeting([Bind(Prefix="NewMeeting")]Meeting model) 

Randbemerkung: Entfernen new { @Value = Model.Info.SubjectId } aus dem verborgenen Eingang und stattdessen den Wert von NewMeeting.SubjectId in der GET-Methode festgelegt, bevor Sie das Modell zur Ansicht übergeben.

+0

OK hat den ersten Teil funktioniert. Aber wenn ich das versteckte Feld verschiebe, wie Sie es beschrieben haben, ist es null (Meeting.SubjectId), wenn es an die CreateMeeting-Aktion übergeben wird. Ich denke, das Formular erstellt ein neues Meeting-Objekt? – rukiman

+0

Ich habe nicht gesagt, um den versteckten Eingang zu bewegen. Verwenden Sie einfach '@ Html.HiddenFor (m => m.NewMeeting.SubjectId)', aber setzen Sie seinen Wert in der GET-Methode, damit Sie eine echte 2-Wege-Modellbindung erhalten, z. 'NewMeeting.SubjectId = Info.SubjectId;' (seine schlechte Praxis, die Funktionalität der 'HtmlHelper' Methoden zu überschreiben, indem man das' value' Attribut setzt) ​​ –

+0

Ok das macht Sinn. Danke, sehr angenehm. – rukiman

1

Sie müssen ReinviteVisitorModel Modell passieren in Ihrem Action

aktualisieren Sie Aktion mit diesem:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult CreateMeeting(ReinviteVisitorModel model) 
{ 
    return RedirectToAction("ReinviteVisitor2", "Home", new { visitorId = model.NewMeeting.SubjectId }); 
}