0

Использование архитектуры 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); 
    } 
} 

ответ

3

Возможно, вам стоит рассмотреть возможность использования класса view-model в вместо передачи ваших объектов домена в ваши представления. Вы можете заполнить свой класс модели представлений из своего запроса домена, передать его вашему представлению и, когда он вернется, в вашем контроллере повторно отобразить его на объект домена и продолжить. Отличный инструмент, который поможет вам сделать это, называется AutoMapper. Это может также помочь в решении других проблем в будущем.

AutoMapper on CodePlex

+0

Спасибо, Райан. Я дам AutoMapper взгляд прямо сейчас и сообщит, как он работал для этого ... Оцените! –

+1

+1: Всегда используйте модели просмотра. –

+0

Это мой ответ. Я уже вижу, что AutoMapper принесет мне пользу. Одно замечание: я должен был уточнить, что я * * использовал класс ViewModel в своем контроллере и перешел на мою страницу - это лучший способ, которым я знаю, отправлять элементы SelectList, которые существуют за пределами моего объекта. –

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

  • Нет связанных вопросов^_^