Использование архитектуры S # arp 1.0RC ...Как я могу получить доступ к объекту с защищенным сетевым устройством в моем контроллере asp.net-mvc из fluent-nhibernate?
У меня есть контроллер, который никогда не обновляет одно из моих свойств.
Мой класс - это абстрактный класс пользователя с свойством менеджера. Менеджер - это подклассы от пользователя, как и Employee.
Я объявил, что свойство setter для Менеджера защищено и предоставил метод AddManager. Таким образом, я мог бы также контролировать пользователей, которые есть у Менеджера из коллекции этого объекта.
Моя проблема заключается в том, что ModelBinder не находит свойство Manager обновленного элемента после обратной передачи. Если я удалю защищенный, он работает нормально. Добавить защищенный назад: суп для меня нет.
Какая часть ниже позволяет мне защитить мой сеттер и все еще получать значение в контроллере после обратной передачи?
Спасибо ...
Вот обязательное отображение (некоторые редактирования из не-частностей):
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="">
<class name="Core.User, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Users" xmlns="urn:nhibernate-mapping-2.2">
<id name="Id" type="Int32" unsaved-value="0" column="UserId">
<generator class="identity" />
</id>
<le snip..>
<many-to-one access="field.camelcase-underscore" cascade="save-update" name="Manager" column="ManagerId" />
<joined-subclass name="Core.Employee, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<key column="EmployeeId" />
</joined-subclass>
<joined-subclass name="Core.Approver, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<key column="ManagerId" />
<bag name="Users" lazy="true" cascade="save-update" inverse="true">
<key column="ManagerId" />
<one-to-many class="Core.User, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
</joined-subclass>
Мой полиморфный класс
public abstract class User : Entity
{
public virtual string Name { get; set; }
private Manager _manager;
public virtual Manager Manager
{
get { return _manager; }
protected set { _manager = value; }
}
public virtual void SetManager(Manager manager)
{
if (_manager != null)
{
_manager.RemoveUser(this);
}
_manager = manager;
}
}
public class Manager : User
{
public Manager()
{
_users = new List<User>();
}
private IList<User> _users;
public virtual IList<User> Users
{
get { return _users; }
protected set { _users = value; }
}
public virtual void AddUser(User user)
{
if (_users.Contains(user)) return;
Users.Add(user);
user.SetManager(this);
}
public virtual void RemoveUser(User user)
{
if (!_users.Contains(user)) return;
Users.Remove(user);
user.SetManager(null);
}
}
Спасибо, Райан. Я дам AutoMapper взгляд прямо сейчас и сообщит, как он работал для этого ... Оцените! –
+1: Всегда используйте модели просмотра. –
Это мой ответ. Я уже вижу, что AutoMapper принесет мне пользу. Одно замечание: я должен был уточнить, что я * * использовал класс ViewModel в своем контроллере и перешел на мою страницу - это лучший способ, которым я знаю, отправлять элементы SelectList, которые существуют за пределами моего объекта. –