0

すべてのユーザーを一覧表示するインデックスページがあります。これは、ユーザーコントローラーに次のようになります-

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

そして、ビューはで始まります

@model IEnumerable<TRS.Models.User>

その後、

 @foreach (var item in Model) {

モデル内のすべてのユーザーをループします。

ここで、モデルをUserモデルと拡張UserDetailsモデルの両方を含むViewModelに変更する必要があります。

ビューモデルを使用するようにインデックスビューを変更しました-

@model IEnumerable<TRS.ViewModels.RegisterViewModel>

しかし、コントローラーでViewModelを埋める方法がわかりません-

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> 
4

4 に答える 4

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);
}
于 2012-10-10T09:21:07.713 に答える
0

Automapperは、まさにこの目的のために作成されました。私はそれを強くお勧めします。

ウィキの「はじめに」セクションを読んでください。

構成すると、コントローラーコードは次のようになります。

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

登録者のリストが含まれているビューモデルを検討することもできますが、それはあなた次第です。

于 2012-10-10T09:20:08.383 に答える
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

           };
       }
   }
于 2012-10-10T09:24:44.203 に答える
0

あなたのviewModel

    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);
}
于 2012-10-10T09:25:12.997 に答える