2012-06-18 7 views
5

Ho i seguenti metodi di azione:modello oggetto incompleta quando tenta di aggiornare

public ActionResult ProfileSettings() 
     { 
      Context con = new Context(); 
      ProfileSettingsViewModel model = new ProfileSettingsViewModel(); 
      model.Cities = con.Cities.ToList(); 
      model.Countries = con.Countries.ToList(); 
      model.UserProfile = con.Users.Find(Membership.GetUser().ProviderUserKey); 
      return View(model); // Here model is full with all needed data 
     } 

     [HttpPost] 
     public ActionResult ProfileSettings(ProfileSettingsViewModel model) 
     { 
      // Passed model is not good 
      Context con = new Context(); 

      con.Entry(model.UserProfile).State = EntityState.Modified; 
      con.SaveChanges(); 

      return RedirectToAction("Index", "Home"); 
     } 

@using (Html.BeginForm("ProfileSettings", "User", FormMethod.Post, new { id = "submitProfile" })) 
     { 
      <li> 
       <label> 
        First Name</label> 
       @Html.TextBoxFor(a => a.UserProfile.FirstName) 
      </li> 
      <li> 
       <label> 
        Last Name</label> 
       @Html.TextBoxFor(a => a.UserProfile.LastName) 
      </li> 
... 
<input type="submit" value="Save" /> 
... 

Quando mi ha colpito presentare il modello ricevuto nel metodo POST è incompleta. Contiene FirstName, LastName ecc. Ma UserID è nullo. Quindi non posso aggiornare l'oggetto. Cosa sto facendo di sbagliato qui?

risposta

2

MVC ricostruisce il modello solo in base a ciò che sta arrivando nella richiesta. Nel tuo caso particolare, stai solo inviando il FirstName e il LastName, perché quelle sono le sole chiamate @Html.TextBoxFor() incluse nella tua vista. I modelli MVC non si comportano come ViewState, non vengono memorizzati da nessuna parte.

Inoltre non si desidera includere l'intera entità nel modello di visualizzazione. Se tutto ciò di cui hai bisogno è l'ID, allora dovrebbe essere tutto ciò che includi. Quindi caricare nuovamente l'entità dal DAL, aggiornare le proprietà che devono essere modificate e quindi salvare le modifiche.

+0

+1 buona risposta. –

1

È necessario memorizzare UserId come campo nascosto nel modulo.

1

Aggiungi un tag html HiddenFor secondo lei, e assicurarsi che si popolano UserId nella vostra azione Get:

@using (Html.BeginForm("ProfileSettings", "User", FormMethod.Post, new { id = "submitProfile" })) 
     { 

@Html.HiddenFor(a => a.UserProfile.UserId) 
// your code here.. 

} 
Problemi correlati