2016-03-24 5 views
1

Ich weiß, diese Frage wurde zuvor gestellt, aber ich habe noch keine Antwort gefunden und mein Beispiel scheint viel einfacher als die meisten. Ich vergewissere mich, dass die Modelldaten im Formular enthalten sind, und ich stelle sicher, dass die Post-Aktion mit der Get-Aktion übereinstimmt. Es gibt keine Datumsformatierungsprobleme. und ich habe ähnliche Ansichten & Controller, die gut funktionieren, mit denen ich verglichen habe. In diesem Beispiel wird herkömmliches Routing verwendet, aber ich habe auch das Attribut-Routing versucht, ohne das Verhalten zu ändern. Ich habe sogar den Editor für ReportName entfernt und stattdessen in HiddenFor eingefügt. Die ausgeblendete ReportID ist immer ausgefüllt und korrekt, ReportName und ReportAbbr sind immer null. :(MVC5 ViewModel Eigenschaften null auf HTTPPost

Als erstes ist hier meine Viewmodel ist:

namespace Core.AdminData 
{ 
    [System.Runtime.Serialization.DataContract(Name = "MyReport")] 
    public class MyReport 
    { 
     [System.Runtime.Serialization.DataMember(Name = "ReportID", Order = 0)] 
     public int ReportID { get; set; } 

     [System.Runtime.Serialization.DataMember(Name = "ReportName", Order = 1)] 
     [Display(Name = "Name")] 
     [Required(ErrorMessage = "Name Required")] 
     public string ReportName { get; private set; } 

     [System.Runtime.Serialization.DataMember(Name = "ReportAbbr", Order = 2)] 
     [Display(Name = "Abbreviation")] 
     [Required(ErrorMessage = "Abbreviation Required")] 
     public string ReportAbbr { get; private set; } 

     public MyReport() 
     { 
      ; 
     } 
    } 
} 

Hier ist mein Controller:

public class ReportsController : Controller 
{ 
    [HttpGet] 
    public ActionResult TrendEdit(int id) 
    { 
     using (Client client = new Client(ConfigHelper.Protocol(), ConfigHelper.Host(), ConfigHelper.Port())) 
     { 
      MyReport rpt = null; 
      try 
      { 
       rpt = client.GetReport(id); 
       if (rpt == null) 
       { 
        TempData["ErrorText"] = "Report does not exist"; 
        return this.RedirectToAction("List"); 
       } 
      } 
      catch (Exception exc) 
      { 
       TempData["ErrorText"] = exc.Message; 
       return this.RedirectToAction("List"); 
      } 
      return View(rpt); 
     } 
    } 

    [HttpPost] 
    public ActionResult TrendEdit(MyReport report) 
    { 
     using (Client client = new Client(ConfigHelper.Protocol(), ConfigHelper.Host(), ConfigHelper.Port())) 
     { 
      try 
      { 
       if (!this.ModelState.IsValid || client.UpdateReport(report).StatusCode != SSStatus.Success) 
       { 
        ViewBag.ErrorText = "An error occurred. Please contact your web administrator for assistance."; 
        return View(report); 
       } 
      } 
      catch (Exception exc) 
      { 
       ViewBag.ErrorText = exc.Message; 
       return View(report); 
      } 
      return this.RedirectToAction("List"); 
     } 
    } 
} 

Und schließlich, hier ist meine Ansicht:

@using Core.AdminData 
@model MyReport 

@{ 
    ViewBag.Title = "Edit Report"; 
    Layout = "~/Views/Shared/_ContentLayout.cshtml"; 
} 

<div class="panel panel-default"> 
    <div class="panel-heading hidden-xs"> 
     <h4>Edit Report</h4> 
    </div> 

    @using (Html.BeginForm()) 
    { 
     @Html.HiddenFor(model => model.ReportID) 

     <div class="container-fluid panel-body"> 
      <div class="row"> 
       <div class="col-xs-12 message-error">@ViewBag.ErrorText</div> 
      </div> 
      <div class="row"> 
       <div class="col-xs-4 col-md-3 custom-label"> 
        @Html.LabelFor(model => model.ReportName) 
       </div> 
       <div class="col-xs-8 col-md-9 custom-field"> 
        @Html.EditorFor(model => model.ReportName) 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-xs-offset-4 col-xs-8 col-md-offset-3 col-md-9 message-error"> 
        @Html.ValidationMessageFor(model => model.ReportName) 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-xs-4 col-md-3 custom-label"> 
        @Html.LabelFor(model => model.ReportAbbr) 
       </div> 
       <div class="col-xs-8 col-md-9 custom-field"> 
        @Html.EditorFor(model => model.ReportAbbr) 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-xs-offset-4 col-xs-8 col-md-offset-3 col-md-9 message-error"> 
        @Html.ValidationMessageFor(model => model.ReportAbbr) 
       </div> 
      </div> 
      <div class="row"> 
       <div class="col-xs-4 col-md-3 text-right"> 
        <input type="submit" value="Save" class="btn btn-default btn-sm" /> 
       </div> 
      </div> 
     </div> 
    } 
</div> 

Wenn ich Ich habe irgendeinen Code verpasst, der hilfreich wäre, bitte lass es mich wissen. Ich hoffe, das ist etwas Offensichtliches. Ich würde lieber einen "Duh" -Moment haben als zu kauen Ich kämpfe mit diesem Code. ;) TIA!

+0

Eine andere Anmerkung, falls es hilft, sind die Daten für ReportName und ReportAbbr ~ in der Anfrage.Form. Es ist nur der report.ReportName im TrendEdit-Post, der null ist. – VG1

Antwort

2

Ihre ReportName und ReportAbbr Eigenschaften haben private Setter, so dass die DefaultModelBinder kann nicht den Wert gesetzt. Ändere sie, um öffentliche Setter zu haben

+0

Danke Stephen! Genau wie ich gehofft hatte - duh! Die Klasse wurde von jemandem geschaffen, der das Unternehmen vor Monaten verlassen hat und ich gerade übernommen habe. Ich schaute mir die Attribute an und dachte, dass einige Meta-Daten falsch sein mussten und die privaten Setter komplett übersehen haben. Ich danke dir sehr! – VG1