2012-06-18 26 views
5

tôi có những phương pháp hành động sau đây:mẫu đối tượng không đầy đủ khi cố gắng để cập nhật

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

Khi tôi nhấn nộp nhận mô hình trong phương thức POST là không đầy đủ. Nó chứa FirstName, LastName vv Nhưng UserID là null. Vì vậy, tôi không thể cập nhật đối tượng. Tôi làm gì sai ở đây?

Trả lời

2

MVC chỉ tạo lại mô hình của bạn dựa trên những gì sắp có trong yêu cầu. Trong trường hợp cụ thể của bạn, bạn chỉ gửi FirstName và LastName, bởi vì đó chỉ là những cuộc gọi @Html.TextBoxFor() được bao gồm trong Chế độ xem của bạn. Các mô hình MVC không hoạt động như ViewState, nó không được lưu trữ ở bất kỳ đâu.

Bạn cũng không muốn bao gồm toàn bộ Pháp nhân trong mô hình chế độ xem của mình. Nếu tất cả những gì bạn cần là ID thì đó là tất cả những gì bạn đưa vào. Sau đó, bạn sẽ tải thực thể của bạn một lần nữa từ DAL của bạn, cập nhật các thuộc tính cần phải được thay đổi, và sau đó lưu các thay đổi của bạn.

+0

+1 câu trả lời tốt. –

1

Bạn nên lưu trữ UserId dưới dạng trường ẩn trong biểu mẫu.

1

Thêm một thẻ HiddenFor html theo quan điểm của mình, và chắc chắn rằng bạn đang Populating UserId trong hành động Nhận của bạn:

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

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

} 
Các vấn đề liên quan