2012-06-18 20 views
5

tengo los siguientes métodos de acción:objeto Modelo incompleto cuando intenta actualizar

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" /> 
... 

Cuando llegué a presentar el modelo recibido en el método POST es incompleta. Contiene FirstName, LastName, etc. pero UserID es nulo. Entonces no puedo actualizar el objeto. ¿Qué estoy haciendo mal aquí?

Respuesta

2

MVC reconstruye su modelo solo en función de lo que viene en la solicitud. En su caso particular, solo está enviando el nombre y el apellido, porque esas son las únicas llamadas @Html.TextBoxFor() incluidas en su vista. Los modelos MVC no se comportan como ViewState, no se almacena en ninguna parte.

Además, no desea incluir toda su entidad en su modelo de visualización. Si todo lo que necesitas es la identificación, entonces debería ser todo lo que incluyas. Luego cargaría su entidad nuevamente desde su DAL, actualizará las propiedades que necesitan ser alteradas y luego guardará sus cambios.

+0

+1 buena respuesta. –

1

Debe almacenar UserId como un campo oculto en el formulario.

1

Añadir una etiqueta HTML HiddenFor en su opinión, y asegúrese de que está completando UserId en su acción Get:

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

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

} 
Cuestiones relacionadas