2012-06-18 25 views
5

Mam następujące metody działania:model obiektowy niekompletne podczas próby aktualizacji

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

Kiedy uderzył w modelu złożyć otrzymane metodą POST jest niekompletna. Zawiera FirstName, LastName itp. Ale UserID ma wartość null. Nie mogę zaktualizować obiektu. Co ja tu robię źle?

Odpowiedz

2

MVC rekonstruuje model tylko na podstawie tego, co nadchodzi w żądaniu. W twoim przypadku przesyłasz tylko Imię i Nazwisko, ponieważ są to jedyne połączenia @Html.TextBoxFor() zawarte w Twoim Widoku. Modele MVC nie zachowują się jak ViewState, nie są nigdzie przechowywane.

Nie należy również uwzględniać całego obiektu w modelu widoku. Jeśli potrzebujesz tylko identyfikatora, powinno to być wszystko, co do niego należysz. Następnie ponownie załadujesz swój obiekt z DAL, zaktualizujesz właściwości, które wymagają zmiany, a następnie zapiszesz zmiany.

+0

+1 dobrą odpowiedź. –

1

Należy przechowywać identyfikator użytkownika jako ukryte pole w formularzu.

1

Dodaj tag HTML HiddenFor w widoku, i upewnij się, że jesteś wypełniania userid w akcji Pobierz:

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

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

} 
Powiązane problemy