2013-04-16 14 views
5

Sto cercando di far funzionare il binding del modello personalizzato, ma per qualche motivo i valori non sono impostati. Il codice sembra ligit quando lo si confronta con il codice funzionante, ma ancora non si lega. Immagino sia una cosa banale che mi manca.Il binding del modello MVC mantiene i valori NULL

modello personalizzato:

//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(); 
    } 
} 

La forma vista si presenta come:

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

E il controllore:

[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 su richiesta

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

Possiamo vedere la classe Cluster? Item.Name è sicuramente una proprietà pubblica piuttosto che un campo pubblico? È passato un po 'di tempo ma IIRC si legherà solo alle proprietà. – Xefan

+0

L'ho aggiunto alla domanda –

+0

Avete controllato se c'è qualcosa in 'UpdateModel' che aggiorna' model.Item'? –

risposta

8

DefaultModelBinder funziona in modo esplicito su 'Proprietà', non su 'campi'

Modifica public Cluster Item-public Cluster Item {get; set;} in AdminClusterCreateModel dovrebbe fare il trucco.

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

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

saluti

Problemi correlati