0

ASP.NET ユーザー データベースのすべてのユーザーを Html.Listbox に入力しようとしています。

次のような ViewModel を作成しました。

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Web.Mvc;
using System.Web.Security;

namespace SkyLearn.Areas.Users.Models
{
public class UsersViewModel
    {
        MembershipUserCollection membershipuserscollection { get; set; }
        public List<MembershipUser> membershipuserslist { get; set; }
        public List<SelectListItem> AvailableUsers { get; set; }

        public UsersViewModel()
        {
            availableUsers = new List<SelectListItem>();
        }  
    }
}

そして、次のような Actionresult :

        public ActionResult Index()
    {
        var users = Membership.GetAllUsers().Cast<MembershipUser>();

        UsersViewModel model = new UsersViewModel();

        foreach (MembershipUser user in users)
        {
            SelectListItem selectuser = new SelectListItem();

            selectuser.Text = user.UserName;
            selectuser.Value = user.UserName;

            model.AvailableUsers.Add(selectuser);
        }

        return View(model);
    }

私の見解では、次のようにリストに入力しようとしています:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SkyLearn.Areas.Users.Models.UsersViewModel>" %>


<%= Html.ListBox("AvailableUsers", Model.AvailableUsers)%>

コードを実行すると、次のエラーが表示されます。

CS1579: 'SkyLearn.Areas.Users.Models.UsersViewModel' には 'GetEnumerator' のパブリック定義が含まれていないため、foreach ステートメントはタイプ 'SkyLearn.Areas.Users.Models.UsersViewModel' の変数に対して操作できません

4

2 に答える 2

1

AvailableUsersは初期化されていません。たとえば、ViewModelのコンストラクターでこれを行うことができます。

public class UsersViewModel
     {
     public UsersViewModel {
         AvailableUsers = new List<SelectListItem>();
     }
     MembershipUserCollection membershipuserscollection { get; set; }
     public List<MembershipUser> membershipuserslist { get; set; }
     public List<SelectListItem> AvailableUsers { get; private set; }
}
于 2012-04-13T19:31:18.963 に答える
0

問題は、ListBox ヘルパーの最初の引数と同じ名前をビュー モデル ( AvailableUsers) のプロパティとして使用していることです。それは正しくありません。最初の引数は、選択した値をバインドするために使用されるビュー モデルのプロパティを表す必要があります。ListBox ヘルパーの場合、ユーザーは複数の値を選択できるため、これはコレクションである必要があります。DropDownList ヘルパーの場合、これは単純なスカラー プロパティである必要があります。2 番目の引数 (どちらの場合も) はSelectListItem、使用可能なオプションをレンダリングするために使用されるコレクションを表します。

それでは、ビュー モデルを改善する方法の例を見てみましょう。

public class UsersViewModel
{
    public string[] SelectedUsers { get; set; }
    public IEnumerable<SelectListItem> AvailableUsers { get; set; }
}

そしてコントローラー:

public ActionResult Index()
{
    var users = Membership.GetAllUsers().Cast<MembershipUser>();
    var model = new UsersViewModel
    {
        AvailableUsers = users.Select(x => new SelectListItem
        {
            Value = x.UserName,
            Text = x.UserName
        })
    };
    return View(model); 
}

そして最後にビュー:

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

<%= Html.ListBoxFor(x => x.SelectedUsers, Model.AvailableUsers) %>

この例では目的を果たさないビュー モデルで最初に持っていたmembershipuserscollectionおよび プロパティを削除したことに気付くでしょう。membershipuserslist1 つ目は非公開で、2 つ目はドメイン モデル ( MembershipUser) のコレクションであるため、ビュー モデルではまったく場所がありません。

于 2012-04-13T20:07:09.050 に答える