[C#] 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;
        }
    }

다음은 뷰를로드하는 컨트롤러입니다.

        //
        // 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)

그러나 나는 운이 없다.



답변

비즈니스 로직을 뷰 모델로 분리 할 수 ​​있으므로 뷰가 더 깔끔하게 분리됩니다.

먼저 사용자가 .NET Framework에 나타날 항목 목록과 함께 선택할 ID를 저장할 뷰 모델을 만듭니다 DropDown.

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>


답변

  @Html.DropDownList("ddl",Model.Select(item => new SelectListItem
{
    Value = item.RecordID.ToString(),
    Text = item.Name.ToString(),
     Selected = "select" == item.RecordID.ToString()
}))


답변

한 가지 방법은 다음과 같습니다.

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

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


답변

가까운 것 :

@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" }


답변

대신 List<UserRole>모델에 SelectList<UserRole>. 또한 SelectedUserRoleId저장할 속성 을 추가 합니다. 선택한 UserRole의 Id 값을 저장합니다.

SelectList를 채운 다음 View에서 다음을 사용하십시오.

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

그리고 당신은 괜찮을 것입니다.

http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.108).aspx 도 참조 하십시오 .


답변

에 대한 호출을 DropDownListFor구체화하려면 몇 가지 매개 변수가 더 필요합니다. 다음 SO 질문에서와 같이 SelectList가 필요합니다.

MVC3 DropDownListFor-간단한 예?

당신이 거기에있는 것을 가지고, 당신은 목록을로드 할 곳이 아니라 데이터를 저장할 위치 만 알려주었습니다.


답변

   @{
        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>