web-dev-qa-db-ja.com

MVCのList <object>からかみそりドロップダウンリストを作成する

私はモデルがあります:

public class DbUserRole
    {
        public int UserRoleId { get; set; }
        public string UserRole { get; set; }
    }

public class DbUserRoles
    {
        public List<DbUserRole> GetRoles()
        {
            BugnetReports RoleDropDown = new BugnetReports();
            List<DbUserRole> Roles = new List<DbUserRole>();
            DataSet table = RoleDropDown.userRoleDropDown();
            foreach (DataRow item in table.Tables[0].Rows)
            {
                DbUserRole ur = new DbUserRole();
                ur.UserRole = Convert.ToString(item["UserRoleName"]);
                ur.UserRoleId = Convert.ToInt32(item["UserRoleID"]);
                Roles.Add(ur);
            }
            return Roles;
        }
    }

そして、これがビューをロードするControllerです。

        //
        // GET: /Admin/AddNewUser

        public ActionResult AddNewUser()
        {
            DbUserRoles Roles = new DbUserRoles();
            return View(Roles.GetRoles());
        }

以下のように@foreachループを使ってリストの項目を表示させることができます。

@foreach (var item in Model)
       {
           <tr>
               <td>
                   @item.UserRoleId
               </td>
               <td>
                   @item.UserRole
               </td>
           </tr>
       }

しかし、どのようにしてパススルーされたモデルをドロップダウンリストに追加するのですか、私は試してみました

@Html.DropDownListFor(x => x.UserRole)

しかし、私は運がありません。

117
Win

ビジネスロジックをビューモデルに分けることができるので、ビューをより明確に分離できます。

最初に、ユーザーがDropDownに表示される項目のリストとともに選択するIDを格納するためのビューモデルを作成します。

ViewModel:

public class UserRoleViewModel
{
    // Display Attribute will appear in the Html.LabelFor
    [Display(Name = "User Role")]
    public int SelectedUserRoleId { get; set; }
    public IEnumerable<SelectListItem> UserRoles { get; set; }
}

参考文献:

コントローラの内部で、あなたのUserRoleリストを取得し、それをビューに表示される形式に変換するためのメソッドを作成します。

コントローラ:

private IEnumerable<SelectListItem> GetRoles()
{
    var dbUserRoles = new DbUserRoles();
    var roles = dbUserRoles
                .GetRoles()
                .Select(x =>
                        new SelectListItem
                            {
                                Value = x.UserRoleId.ToString(),
                                Text = x.UserRole
                            });

    return new SelectList(roles, "Value", "Text");
}

public ActionResult AddNewUser()
{
    var model = new UserRoleViewModel
                    {
                        UserRoles = GetRoles()
                    };
    return View(model);
}

参考文献:

ビューモデルが作成されたので、プレゼンテーションロジックは単純化されました。

見る:

@model UserRoleViewModel

@Html.LabelFor(m => m.SelectedUserRoleId)
@Html.DropDownListFor(m => m.SelectedUserRoleId, Model.UserRoles)

参考文献:

これは作り出すでしょう:

<label for="SelectedUserRoleId">User Role</label>
<select id="SelectedUserRoleId" name="SelectedUserRoleId">
    <option value="1">First Role</option>
    <option value="2">Second Role</option>
    <option value="3">Etc...</option>
</select>
233
Dustin Kingen
  @Html.DropDownList("ddl",Model.Select(item => new SelectListItem
{
    Value = item.RecordID.ToString(),
    Text = item.Name.ToString(),
     Selected = "select" == item.RecordID.ToString()
}))
28
Ankita Singh

1つの方法があります。

    <select name="listbox" id="listbox">
    @foreach (var item in Model)
           {

                   <option value="@item.UserRoleId">
                      @item.UserRole 
                   </option>                  
           }
    </select>
24
neildt

に近いもの:

@Html.DropDownListFor(m => m.UserRole, 
   new SelectList(Model.Roles, "UserRoleId", "UserRole", Model.Roles.First().UserRoleId), 
   new { /* any html  attributes here */ }) 

DropDownListForを設定するには、SelectListが必要です。必要なHTML属性については、次のものを追加できます。

new { @class = "DropDown", @id = "dropdownUserRole" }
10
Jonesopolis

List<UserRole>の代わりに、ModelにSelectList<UserRole>を含めることができます。また、選択したUserRoleのId値を格納するためのプロパティSelectedUserRoleIdを追加します。

SelectListに入力してから、Viewで使用します。

@Html.DropDownListFor(x => x.SelectedUserRoleId, x.UserRole)

そして、あなたは大丈夫なはずです。

http://msdn.Microsoft.com/ja-jp/library/system.web.mvc.selectlist(v = vs. 108).aspx も参照してください。

7
Roy Dictus

DropDownListForへの呼び出しには、それを具体化するためのさらにいくつかのパラメーターが必要です。次のSO質問のように、SelectListが必要です。

MVC3 DropDownListFor - 簡単な例は?

あなたがそこに持っているもので、あなたはそれをリストをどこからロードするのではなく、どこにデータを格納するのかを言っただけです。

2
MisterJames
   @{
        List<CategoryModel> CategoryList = CategoryModel.GetCategoryList(UserID);
        IEnumerable<SelectListItem> CategorySelectList = CategoryList.Select(x => new SelectListItem() { Text = x.CategoryName.Trim(), Value = x.CategoryID.Trim() });
    }
    <tr>
        <td>
            <B>Assigned Category:</B>
        </td>
        <td>
            @Html.DropDownList("CategoryList", CategorySelectList, "Select a Category (Optional)")
        </td>
    </tr>
1
Deathstalker

私はあなたがUsersモデルを持っているかのようにこれに取り組みます。

Users.cs

public class Users
{
    [Key]
    public int UserId { get; set; }

    [Required]
    public string UserName { get; set; }

    public int RoleId { get; set; }

    [ForeignKey("RoleId")]
    public virtual DbUserRoles DbUserRoles { get; set; }
}

データベース内のその名前でテーブルを表したDbUserRolesモデル

DbUserRoles.cs

public partial class DbUserRoles
{
    [Key]
    public int UserRoleId { get; set; }

    [Required]
    [StringLength(30)]
    public string UserRole { get; set; }
}

クリーンアップしたら、次のようにしてControllerにUserRolesのコレクションを作成して入力できるようになります。

var userRoleList = GetUserRolesList();
ViewData["userRoles"] = userRolesList;

そしてこれらの支持機能を持っている:

private static SelectListItem[] _UserRolesList;

/// <summary>
/// Returns a static category list that is cached
/// </summary>
/// <returns></returns>
public SelectListItem[] GetUserRolesList()
{
    if (_UserRolesList == null)
    {
        var userRoles = repository.GetAllUserRoles().Select(a => new SelectListItem()
         {
             Text = a.UserRole,
             Value = a.UserRoleId.ToString()
         }).ToList();
         userRoles.Insert(0, new SelectListItem() { Value = "0", Text = "-- Please select your user role --" });

        _UserRolesList = userRoles.ToArray();
    }

    // Have to create new instances via projection
    // to avoid ModelBinding updates to affect this
    // globally
    return _UserRolesList
        .Select(d => new SelectListItem()
    {
         Value = d.Value,
         Text = d.Text
    })
     .ToArray();
}

Repository.cs

上記の関数のMy Repository関数GetAllUserRoles()

public class Repository
{
    Model1 db = new Model1(); // Entity Framework context

    // User Roles
    public IList<DbUserRoles> GetAllUserRoles()
    {
        return db.DbUserRoles.OrderBy(e => e.UserRoleId).ToList();
    }
}

AddNewUser.cshtml

それからあなたの意見でこれをしなさい:

<table>
    <tr>
        <td>
            @Html.EditorFor(model => model.UserName,
                  htmlAttributes: new { @class = "form-control" }
                  )
        </td>
        <td>
            @Html.DropDownListFor(model => model.RoleId,
                  new SelectList( (IEnumerable<SelectListItem>)ViewData["userRoles"], "Value", "Text", model.RoleId),
                  htmlAttributes: new { @class = "form-control" }
                  )
         </td>
     </tr>
 </table>
0
vapcguy