2012-06-18 2 views
5

У меня есть следующие методы действий:объект модель неполна при попытке обновить

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

Когда я ударил представить полученную модель в метод POST является неполным. Он содержит FirstName, LastName и т. Д. Но UserID имеет значение NULL. Поэтому я не могу обновить объект. Что я здесь делаю неправильно?

ответ

2

MVC реконструирует вашу модель только на основе того, что входит в запрос. В вашем конкретном случае вы отправляете только FirstName и LastName, потому что это только @Html.TextBoxFor() звонки, включенные в ваш просмотр. Модели MVC не ведут себя как ViewState, они нигде не хранятся.

Вы также не хотите включать всю свою Entity в свою модель просмотра. Если все, что вам нужно, это идентификатор, тогда все должно быть включено. Затем вы снова загрузите свой объект из своего DAL, обновите свойства, которые необходимо изменить, а затем сохраните изменения.

+0

+1 хороший ответ. –

1

Вы должны сохранить UserId как скрытое поле в форме.

1

Добавить тег HTML HiddenFor на ваш взгляд, и убедитесь, что вы заселение UserId в вашем Получить действия:

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

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

} 
Смежные вопросы