2009-08-31 53 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」中將選定的應用程序應用於此,以便獲得正確的類型等等?模型中有更多東西? – 2009-08-31 18:09:40

+0

它是MultiSelectList的一部分。我修復了我提供的bove中的錯誤,以返回視圖並添加了更多代碼。 – andymeadows 2009-08-31 20:41:35

+0

通過MultiSelectList的一部分,列表本身包含所有值,然後包含當前對象內選定的值。 – andymeadows 2009-08-31 20:46:35