2012-06-18 6 views
5

Ich habe folgende Aktionsmethoden zu aktualisieren:Modell Objekt unvollständig, wenn Versuch

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

Als ich erhielt Modell Hit einreichen in POST-Methode ist unvollständig. Es enthält FirstName, LastName usw. Aber UserID ist null. Also kann ich das Objekt nicht aktualisieren. Was mache ich hier falsch?

Antwort

2

MVC rekonstruiert Ihr Modell nur basierend auf dem Inhalt der Anfrage. In Ihrem speziellen Fall reichen Sie nur den Vornamen und den Nachnamen ein, da dies die einzigen in Ihrer Ansicht enthaltenen Aufrufe @Html.TextBoxFor() sind. MVC-Modelle verhalten sich nicht wie ViewState, sie werden nirgendwo gespeichert.

Sie möchten auch nicht Ihre gesamte Entität in Ihr Ansichtsmodell aufnehmen. Wenn alles, was Sie brauchen, die ID ist, dann sollte das alles sein, was Sie einschließen. Dann würden Sie Ihre Entität erneut von Ihrem DAL laden, die Eigenschaften aktualisieren, die geändert werden müssen, und dann Ihre Änderungen speichern.

+0

+1 gute Antwort. –

1

Sie sollten die UserId als ein verstecktes Feld in dem Formular speichern.

1

ein HTML-Tag HiddenFor Ihrer Ansicht hinzufügen, und stellen Sie sicher, dass Sie Benutzer-ID in Ihrem Get Aktion bevölkern:

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

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

} 
Verwandte Themen