2012-10-10 68 views
0

我有一個列出所有用戶的索引頁面。這已在用戶控制下 -從使用模型更改爲ViewModel

public ViewResult Index() 
     { 
      return View(userRepository.AllIncluding(user => user.Roles)); 
     } 

,然後觀與

@model IEnumerable<TRS.Models.User> 

開始,然後使用

@foreach (var item in Model) { 

遍歷在我的模型的所有用戶。

我現在需要將我的模型更改爲包含用戶模型和擴展UserDetails模型的ViewModel。

我已經改變了我的索引視圖使用視圖模型 -

@model IEnumerable<TRS.ViewModels.RegisterViewModel> 

但我不知道我應該如何去約在我的控制器填充視圖模型 -

public ViewResult Index() 
     { 

      var viewModel = new RegisterViewModel 
      { 
       UserName = "???" 
       FirstName = "???" 
       LastName = "???" 
      }; 

      return View(viewModel); 
     } 

我假設我需要創建視圖模型的實例,然後將其傳遞給視圖。但我不明白我如何才能針對每個單獨的項目獲取數據。我顯然需要在這裏獲取所有用戶的所有數據,然後在我的視圖中遍歷它們。任何想法我應該在控制器上面去?什麼應該取代「???」這將填充viewModel的所有數據?或者這是錯誤的方法?

感謝

編輯 - 添加模型 -

public class User 
    { 
     [Key] 
     public string UserName { get; set; } 

     public virtual ICollection<Role> Roles { get; set; } 
     public virtual UserDetails UserDetails { get; set; } 
} 


public class UserDetails 
    { 

     [Key] 
     public string UserName { get; set; } 
     public string Firstname { get; set; } 
     public string Lastname { get; set; } 

     [Required] 
     public virtual User User { get; set; } 
} 

編輯 - 從視圖 -

<td> 
       @foreach (Role role in item.Roles){ 
       @role.RoleName <br /> 
    }</td> 

回答

1
public ActionResult Index() 
{ 
    var usersVm = userRepository 
     .AllIncluding(user => user.Roles) 
     .Select(user => new RegisterViewModel 
     { 
      UserName = user.UserName 
      FirstName = user.UserDetails.FirstName 
      LastName = user.UserDetails.LastName 
     }); 
    return View(usersVm); 
} 
+0

感謝您的。它似乎現在部分工作,我的視圖顯示用戶名(但沒有其他數據),其他數據來自UserDetails模型。這個數據現在是否可用? –

+0

你在說什麼其他數據?什麼是UserDetails?請出示您的模型。 –

+0

我已經編輯了上面的內容來包含我的User和UserDetails模型。謝謝你的幫助。 –

0

Automapper是爲這事創建。我強烈推薦它。

請閱讀wiki的getting started部分。

一旦你擁有了它配置控制器代碼會是這個樣子:

List<RegisterViewModel> registrants = 
        Mapper.Map<List<User>, List<RegisterViewModel>>(users); 

雖然你可能要考慮的是對他們登記列表的視圖模型,但最多也就是你。

0

從你的問題來看,還不清楚UserDetails是什麼樣的。

您不應該在您的視圖中使用IEnumerable <RegisterViewModel>。該RegisterViewModel應該是一切的容器,你需要在視圖:

public ViewResult Index() 
    { 
     var usersDetails = GetUserDetails(userRepository.AllIncluding(user => user.Roles)); 

     var viewModel = new RegisterViewModel 
     { 
      UserDetails = usersDetails.ToList(), 
      SomeMoreDataRequiredByTheView= "1" 
     }; 

     return View(viewModel); 
    } 

    //you can use automapper to do this dirty job. 
    private IEnumerable<UserDetails> GetUserDetails(IEnumerable<User> users) 
    { 
     foreach(var user in users) 
     { 
      yield return new UserDetails() 
      { 
       FullName = user.FirstName + " " + user.LastName, 
       // Other stuff you want 

      }; 
     } 
    } 
+0

對不起,在我的例子中UserName來自用戶模型,FirstName和LastName來自UserDetails模型(它只保存關於用戶的擴展信息) –

0

您的視圖模型

Public Class RegisterViewModel 
    { 
     Public IEnumerable<TRS.Models.User> AllUsers {get;set;} 
     Public IEnumerable<TRS.Models.UserDetails> UserDetails {get;set;} 
    } 

然後在你的控制器

public ViewResult Index() 
{ 

    var viewModel = new RegisterViewModel 
    { 
     AllUsers = userRepository.AllIncluding(user => user.Roles).ToList() 
    }; 

    var DetailList = new list<TRS.Models.UserDetails>(); 
    foreach(var user in viewModel.AllUsers) 
    { 
     DetailList.add(new userDetails 
     { 
      name = user.Name, 
      age = user.age, 
      .... 
     } 
    } 

    viewModel.UserDetails = DetailList; 

    return View(viewModel); 
}