ASP.NET MVC Bind Exclude не работает на вложенный объект в модели представления? - PullRequest
2 голосов
/ 07 декабря 2010

У меня были такие проблемы некоторое время, но раз и навсегда хотелось бы знать, что происходит:)

У меня есть простое представление ASP.NET MVC, которое привязано к классу модели представления MemberViewModel.

MemberViewModel содержит объект сущности Linq To Sql, с которым моя форма в основном связана с именем Member, однако у меня есть еще три других поля формы, связанных с дочерним классом с именем Member.User.

Member содержит личную информацию о пользователе, а Member.User содержит имя пользователя + информацию о пароле, которые хранятся в отдельных таблицах в БД.

Теперь, как я уже говорил, объект модели представления использует собственный класс модели представления под названием MemberViewModel, содержимое которого выглядит следующим образом:

[Bind(Exclude = "EncryptedPassword")]
public class MemberViewModel : ViewModel
{
    public Member Member { get; set; }

    public string Password { get; set; }
    [DisplayName("Confirm Password")]
    public string ConfirmPassword { get; set; }

    public MemberViewModel() { }
    public MemberViewModel(Member member, SelectList countryList)
    {
        Member = member;
        CountryList = countryList;
    }
}

Вы можете видеть, как существует только одна ссылка на Member. Member - это объект Linq to Sql, внутри которого есть ссылка на User. Password + ConfirmPassword и формировать только поля и не иметь эквивалентного аналога в Linq To Sql.

Теперь моя проблема заключается в том, что всякий раз, когда я отправляю форму, мое свойство ModelState.IsValid всегда возвращает false, указывая, что ошибка модели равна The EncryptedPassword field is invalid.

Теперь независимо от того, добавляю ли я [Bind(Exclude = "Member.User.EncryptedPassword")] к своему MemberViewModel в качестве атрибута класса или к частичному классу для самого User, так как [Bind(Exclude = "EncryptedPassword")] ModelState.IsValid постоянно утверждает, что оно недопустимо.

  1. Как я могу заставить это функционировать и исключить дочерние свойства из проверки состояния модели?
  2. Как Bind Exclude действительно работает и каков наилучший метод для дочерних объектов и работы с привязкой моделей в сочетании с моделями представления?

С наилучшими пожеланиями, GONeale

Ответы [ 2 ]

5 голосов
/ 07 декабря 2010

Атрибут [Bind] влияет только на привязку модели. То есть будет ли среда ASP.NET MVC пытаться заполнить свойство из запроса.

Ваша проблема связана с проверкой - совершенно другой зверь. :)

0 голосов
/ 07 декабря 2010

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

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

Под DTO я имею в виду простые - обычно плоские - объекты, которые выглядят примерно так:

public class Dto
{
    public string PropertyName { get; set; }
    public string PropertyNameSubPropertyName { get; set; }
}

Для получения дополнительной информации и инструмента, помогающего сопоставить dtos и доменные объекты, ознакомьтесь с Automapper ..

...