ASP.NET MVC опубликовал сущность, не сопоставленную с моделью LINQ - PullRequest
2 голосов
/ 16 сентября 2009

У меня есть страница, которая строго относится к моему классу "Пользователь". Когда он загружается, я загружаю его по идентификатору из базы данных и передаю его в представление.

Когда публикуется форма редактирования, объект отправляется в метод контроллера нормально, с некоторыми другими параметрами. Объект имеет свои свойства, заполненные в форме, но его идентификатор (который явно отсутствует в форме) не публикуется.

Даже когда я вручную устанавливаю его в код в качестве идентификатора и пытаюсь сохранить свой контекст, в базе данных ничего не происходит.

Вот примерное представление кода с вещами, взятыми для краткости.

public ActionResult MyProfile()
{
    ViewData["Countries"] = new SelectList(userService.GetCountries(), "id", "name");
    return View(userService.GetById(CurrentUser.id));
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MyProfile(MSD_AIDS_Images_Data.LINQRepositories.User user, string password2)
{
    user.id = CurrentUser.id;  //user id isn't posted, so need to reassign it
userService.SaveChanges();
}

Я написал код, подобный этому, дюжину раз, и он сработал, что не так?

EDIT

Когда я отлаживаю объект пользователя, его свойства PropertyChanged и PropertyChanging устанавливаются в NULL

Ответы [ 2 ]

1 голос
/ 16 сентября 2009

Объект User, поступающий в метод MyProfile, не связан с контекстом LINQ. Вам необходимо использовать явное связывание, используя UpdateModel , например ::

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MyProfile(int id, string password2)
{
    MSD_AIDS_Images_Data.LINQRepositories.User user = <LINQ query to load user by id>;

    UpdateModel(user); // updates the model with form values

    userService.SaveChanges();
}

Обратите внимание, что вы можете внедрить пользовательский механизм связывания модели, который делает это до вызова метода вашего контроллера, чтобы вы могли принять User в качестве параметра, но я предполагаю, что вы этого не сделали.

0 голосов
/ 16 сентября 2009

Я исправил проблемы привязки модели, используя перегрузку Обновление модели, которая позволяет вам указать, какие свойства в модели вы хотите обновить:

    string[] includeProperties = {"password", "firstname", "lastname", "email", "affiliation", "countryId"};
    UpdateModel(user, includeProperties);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...