2009-08-31 3 views
0

ViewData 대신 강력하게 형식화 된 모델로 변환하려고합니다. 그러나 어떻게 보일 것인가?강력한 형식의보기로 목록 상자 만들기?

내 컨트롤러에서이있어 :

public ActionResult UserEdit(int? userID) 
    { 
     User u; 

     if (userID == null) 
     { 
      u = new User(); 
     } 
     else 
     { 
      u = _us.GetUsers(userID.Value).First(); 
      u.Usergroups.Load(); 
     } 

     List<int> selectedUsergroupIDs = new List<int>(); 

     foreach (Usergroup item in u.Usergroups) 
     { 
      selectedUsergroupIDs.Add(item.UsergroupID); 
     } 

     MultiSelectList UsergroupID = new MultiSelectList(_ug.GetUsergroups(), "UsergroupID", "UsergroupName", selectedUsergroupIDs); 

     ViewData["UsergroupID"] = UsergroupID; 


     return View("UserEdit", new UserAdminEditViewModel { User = u, Usergroups = _ug.GetUsergroups() }); 
    } 

내 모델에서 내보기에 추가 할 필요가 있는지이 경우 "UsergroupID"? 사전에

감사

/M

답변

1

나는 전체 질문을 이해하지만, 당신은 페이지에서이 모델을 사용할 수 있도록하기 위해 무엇을 할 수 있는지 요청하는 경우, 페이지에서 상속 확인 확실하지 ViewPage<UserAdminEditViewModel>.

또한 MultiSelectList 클래스에는 선택된 값과 선택되지 않은 값이 모두 있으므로보기 모델에서 두 값을 모두 가질 필요가 없으므로 모델의 단일 멤버와 페어링 할 수 있습니다. 이런 식으로 보이려면 UserAdminEditViewModel을 변경해야합니다. 컨트롤러의 끝에서

public class UserAdminEditViewModel 
{ 
    public User User { get; set; } 
    public IEnumerable<SelectListItem> UserGroups { get; set; } 
} 

: 다음

userGroups = new MultiSelectList(_ug.userGroups(), "Id", "Name", (from g in User.Usergroups select g.Id.Value).ToList()), new { size = 6 }) 
return View("UserEdit", new UserAdminEditViewModel { User = u, UserGroups = userGroups }); 

,보기 페이지 : 또한

<%@ Page Title="User Admin Edit" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<UserAdminEditViewModel>" %> 
<%-- ... --%> 

    <% using (Html.BeginForm()) {%> 

      <div> 
       <label for="Title">User name:</label> 
       <%= Html.TextBox("Title", Model.User.Username) %> 
      </div> 
      <div> 
       <label for="Groups">Groups:</label> 
       <%= Html.ListBox("SelectedGroups", Model.UserGroups)%> 
      </div> 
      <%-- ... --%> 
    <% } %> 
<%-- ... --%> 

, 당신은()를 두 번 _ug.GetUsergroups를 호출하고 주. 그 해결책이 없어져야하지만 여전히 참조해야 할 필요가 있다면 액션 호출 내에서 캐싱하지 않는 것이 좋습니다. 메서드 호출 자체에 캐싱하지 않으면 목록이 필요할 때마다 데이터베이스에 도달하지 않습니다. .

이 질문에 대한 답변입니다. 그렇지 않은 경우 명확히하십시오. 또한이 코드를 테스트하지 않았으므로 컴파일 할 수는 없지만 제대로 작동해야합니다.

+0

_ug.GetUsergroups()는 모든 사용자 그룹을 가져옵니다. "u.Usergroups"에 선택한 사용자 그룹을 적용하여 올바른 유형 등을 얻는 방법은 무엇입니까? 모델에 더 많은 것들이 있습니까? –

+0

그것은 MultiSelectList의 일부입니다. 내가보기를 반환에 대한 bove 제공 한 오류를 수정하고 더 많은 코드를 추가했습니다. – andymeadows

+0

MultiSelectList의 일부로 목록 자체는 모든 값을 포함하고 현재 개체에서 선택된 값을 포함합니다. – andymeadows