Как добавить реляционные данные в объект данных ASP.net MVC Создать представление? - PullRequest
2 голосов
/ 06 марта 2009

Допустим, у меня есть таблица сотрудников и отдельная таблица ролей сотрудников в отношениях «многие ко многим» (т. Е. С таблицей StaffMembersInRoles между ними). Используя структуру сущностей ADO.net, мы имеем объектную модель, подобную этой: альтернативный текст http://martindoms.com/img/datamodel.png

У меня есть контроллер StaffController с методом create и представлением Create, которое в значительной степени является стандартным автоматически генерируемым типом. Я хочу, чтобы страница создания перечисляла роли в таблице StaffRoles с флажком рядом с каждым, и когда нажата кнопка отправки, они добавляются в новый StaffMember StaffRole IEnumable (и поэтому соответствующие записи делаются в таблице StaffMembersInRoles). Как бы я поступил так со строго типизированным представлением?

Ответы [ 2 ]

4 голосов
/ 10 марта 2009

Вот как бы я это сделал:

Во-первых, вам нужен массив всех возможных ролей. В контроллере я бы сделал что-то вроде этого (я делаю некоторые предположения о вашем DAO):

ViewData["AllRoles"] = (StaffRole[])StaffRole.FindAll();

Затем, по вашему мнению, пройдитесь по ролям:

<% foreach (StaffRole Role in (StaffRole[])ViewData["AllRoles"]) { %>

 <p>
  <label>
   <%= Html.CheckBox("Role_"+Role.RoleId.ToString()) %>
   <%= Html.Encode(Role.RoleName) %>
  </label>
 </p>

<% } %>

Затем в вашем контроллере POST сделайте что-то вроде этого:

foreach (StaffRole Role in (StaffRole[])StaffRole.FindAll())
{
  if (Request.Params["Role_"+Role.RoleId.ToString()]=="true")
    MyStaff.Roles.Add(Role);
}
1 голос
/ 12 марта 2009

Привет. Проблема с этим подходом в том, что у вас нет сущности со строгим типом, переданной в View. В этой задаче вам нужна информация StaffMember и список всех сущностей StaffRole. PS: мне действительно не нравится подход приведения списка в представление: StaffRole []) ViewData ["AllRoles"]

Обычно я предпочитаю работать с DTO.

DTO:

public StaffMemberDto
{ 
    public int StaffMemberId { get; set; }
    public IList<StaffRoleDto> AllStaffRoles { get; set;}
    public IList<StaffRoleDto> MembersRolesAttached  { get; set;}
}

public StaffRoleDto
{
    public int RoleId {get; set;}
    public string RoleName { get; set; }
}

Контроллер:

return View(StaffMemberDto);

Таким образом, в представлении все роли строго типизированы:

foreach (var role in ViewDate.Model.AllStaffRoles)
{
    ...
}

И в этом посте вы можете отправить StaffMemberDto с хорошим RoleDto, уже назначенным в представлении, или вы можете выполнить трюк Request, чтобы установить флажки с идентификатором.

Что ж, в таком виде я, вероятно, буду использовать jquery для запроса addRole каждый раз, когда кто-нибудь ставит галочку для добавления роли. Это добавит в вашу форму ajax, и вы не получите постбэка.

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