Свойства модели ASP.NET MVC не отображаются, возвращая значение NULL - PullRequest
0 голосов
/ 14 марта 2011

У меня есть модель EF Code First с таким свойством ICollection.

public class AccountProfile
{
    [Key]
    public int AccountID { get; set; }

    public string AccountName { get; set; }

    public string Email { get; set; }

    [Required]
    public virtual ICollection<UserProfile> LinkedUserProfiles { get; set; }
}

Я связываю представление редактирования с этой моделью, но оно отображает только свойства AccountName и Email.

У меня есть HttpPost ActionResult для обновления модели, которая принимает AccountProfile.

При публикации объект AccountProfile имеет только заполненные свойства AccountName и Email.LinkedUserProfiles является нулевым.Это означает, что модель не может быть обновлена, так как требуется свойство LinkedUserProfiles.

Я также безуспешно пробовал что-то вроде следующего

        var curAccountProfile = _accountProfileRepository.GetById(accountProfile.AccountID);

        TryUpdateModel(curAccountProfile);

Что я делаю не так?Как следует обрабатывать это обстоятельство в MVC?

ОБНОВЛЕНИЕ Данные поступали из репозитория, например.

var accountProfile = _accountProfileRepository.ById(1);
return View(accountProfile);

Проверка объекта accountProfile перед загрузкой представления показываетчто коллекция извлекается - так что это не тот случай, когда ленивая загрузка работает не так, как ожидалось.

С тех пор я реализовал AutoMapper, создал ViewModel для представления и изменил свой код так:1022 *

var accountProfile = _accountProfileRepository.ById(accountInformation.AccountID);
var result = _mappingEngine.Map<DisplayAccountInformationViewModel, AccountProfile>(accountInformation, accountProfile);
_unitOfWork.Commit();

Теперь это работает, как и ожидалось - но кажется, что нужно приложить больше усилий, чем следовало бы?

1 Ответ

0 голосов
/ 15 марта 2011

Попробуйте готовность к загрузке LinkedUserProfiles:

var curAccountProfile = _accountProfileRepository
     .GetById(accountProfile.AccountID)
     .Include(ap => ap.LinkedUsedProfiles);

Похоже, вы используете шаблон Repository, поэтому не знаете, как вы справитесь с готовой загрузкой.Мои репозитории возвращают IQueryable<T>, для которого методы расширения Include работают.

Если вы не используете IQueryable<T>, то вам может потребоваться выполнить энергичную загрузку внутри репозитория (например, принятьлогический флаг, например: GetById(int id, bool include profiles).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...