2013-04-16 14 views
5

Ich versuche, benutzerdefinierte Modellbindung zu arbeiten, aber aus irgendeinem Grund werden die Werte nicht festgelegt. Der Code scheint ligit zu sein, wenn er mit dem Arbeitscode verglichen wird, aber er bindet nicht. Ich denke, es ist eine Kleinigkeit, die ich vermisse.MVC-Modellbindung hält Werte NULL

Benutzerdefinierte Modell:

//Cluster is from Entity Framework 

//BaseViewModelAdmin defines: 
public List<KeyValuePair<string, string>> MenuItems; 
public IPrincipal CurrentUser = null; 
public Foundation Foundation; //also from Entity Framework 

public class AdminClusterCreateModel : BaseViewModelAdmin 
{ 
    public Cluster Item; 
    public AdminClusterCreateModel() 
    { 
     Item = new Cluster(); 
    } 
} 

Die Ansicht Form wie folgt aussieht:

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Cluster</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Item.Active) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Item.Active) 
      @Html.ValidationMessageFor(model => model.Item.Active) 
     </div> 


     <div class="editor-label"> 
      @Html.LabelFor(model => model.Item.Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Item.Name) 
      @Html.ValidationMessageFor(model => model.Item.Name) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

und der Steuerung:

[HttpPost] 
public ActionResult Create(AdminClusterCreateModel model, FormCollection form) 
{ 
    if(ModelState.IsValid) //true 
    { 
     var test = form["Item.Name"]; //Value is correct from form (EG: Test) 
     UpdateModel(model); //no error 
    } 

    //At this point model.Item.Name = null <--- WHY? 

    return View(model); 
} 

Cluster auf Anfrage

public partial class Cluster 
{ 
    public Cluster() 
    { 
     this.Team = new HashSet<Team>(); 
    } 

    public long Id { get; set; } 
    public System.DateTime Created { get; set; } 
    public System.DateTime Modified { get; set; } 
    public bool Active { get; set; } 
    public long FoundationId { get; set; } 
    public string Name { get; set; } 

    public virtual Foundation Foundation { get; set; } 
    public virtual ICollection<Team> Team { get; set; } 
} 
+1

Können wir Ihre Cluster-Klasse? Ist Item.Name definitiv eine öffentliche Eigenschaft und kein öffentliches Feld? Es ist eine Weile her, aber IIRC wird nur an Eigenschaften binden. – Xefan

+0

Ich habe es zu der Frage hinzugefügt –

+0

Haben Sie überprüft, ob es etwas in 'UpdateModel' gibt, das' model.Item' aktualisiert? –

Antwort

8

Default ausdrücklich auf ‚Eigenschaften‘, nicht auf ‚Fields‘ arbeitet

Ändern public Cluster Item-public Cluster Item {get; set;} in AdminClusterCreateModel sollte es tun.

public class AdminClusterCreateModel : BaseViewModelAdmin 
{ 
    public Cluster Item {get; set;} 

    public AdminClusterCreateModel() 
    { 
     Item = new Cluster(); 
    } 
} 

Grüße