2015-01-16 1 views
1

MenuType의 definiation :ASP.NET MVC - 드롭 다운 - 유형의 어떤을 ViewData 항목이 없다 '는 IEnumerable은 <SelectListItem>'

public string Code { get; set; } 
public string Name { get; set; } 

ASP.NET MVC 내가 검색과 나 '전에 읽고 5

안녕하세요, 내 질문을 여기에 게시

나는 왜 그렇게 복잡합니까 asp.net mvc dropdownlist에서 데이터를로드하려고 해요?

// 컨트롤러

public class ClientController : BaseController 
{ 
    public ActionResult Index() 
    { 
     List<MenuType> ctypelist = db.ContractTypes.OrderBy(x => x.TypeOfContract).ToList(); 

     IEnumerable<SelectListItem> list = new SelectList(ctypelist.ToList()); 
     ViewBag.DropDownTypeOfContract = list; 
     return View(); 
    } 

} 

// HTML

@model myapp.Models.Client 


@Html.DropDownList("Codes", (List<SelectListItem>)ViewBag.DropDownTypeOfContract , new { style = "max-width: 600px;" })%> 
+0

MenuType에 대한 정의는 무엇입니까? 그리고 MenuType 유형의 ContractTypes입니까? –

+0

당신의 평판과 함께 나는 당신이 질문을 편집하는 방법을 이해할 것이라고 생각할 것입니다 ... 코드는 코멘트에 속하지 않습니다. –

답변

2

무엇 복잡하면 할 수 있다는 것입니다 어떤 유형을 사용 중인지 결정하지 않는 것 같습니다 ...

먼저 당신이 가지고 List<MenuType> (나는 ContractTypes 유형 MenuType의 실제로 가정?) 그런 다음 MenuType 적어도 두 가지 속성 중 하나라는 TextValue라는 하나가 있어야한다는 것을 의미 그것으로 List<MenuType>을 통과하는 SelectList을 만듭니다. 그렇지 않다면, SelectList 생성자 매개 변수에 TextValue 속성 이름을 지정해야합니다.

그런 다음 어떤 이유 때문에 IEnumerable<SelectListItem>으로 변환 한 다음 ViewBag 항목에 할당하고보기를 호출합니다. 따라서이 시점에서 ViewBag.DropDownTypeOfContract는 IEnumerable<SelectListItem>입니다.

다음으로,보기에서 어떤 이유로 모델을 전혀 전달하지 않는 @model 회원을 정의합니다. 좋아 .... 뭐든간에 ...

그럼 이제 진짜 문제가 발생합니다.

@Html.DropDownList("Codes", 
    (List<SelectListItem>)ViewBag.DropDownTypeOfContract , 
    new { style = "max-width: 600px;" })%> 

자, 잠시 동안 어떤 이유로 든 WebForms 클로징 코드 블록 표시기 (%>)가 있다는 사실을 무시합시다 ...여기서 가장 큰 문제는 ViewBag.DropDownTypeOfContractList<SelectListItem> 번으로 캐스팅하려고한다는 것입니다.

List<MenuType>SelectList으로 변환 한 다음 IEnumerable<SelectListItem>으로 변환했습니다. 어떤 List<SelectListItem>도 참여하지 않았습니다. 그래서

, 간단한 수정 (제정신으로 코드를 재 작성 외에)과 같은 캐스트를 변경하는 것입니다 :

@Html.DropDownList("Codes", 
    (IEnumerable<SelectListItem>)ViewBag.DropDownTypeOfContract, 
    new { style = "max-width: 600px;" }) 

편집 :

당신의 MenuType 적절한 속성을 포함하지 않기 때문에, 당신 (위에서 언급 한대로) SelectList를 수정해야합니다. 참고로, ctypelist는 이미 목록입니다. 목록으로 다시 변환 할 필요가 없습니다. 단지 바보입니다.

IEnumerable<SelectListItem> list = new SelectList(ctypelist, "Code", "Name"); 
+0

에 전달하여 코드를 테스트 해 봅니다. ? 나는 'ViewData 아이템이 없다'IEnumerable ' –

+0

@AbuHamzah - 값이 null입니까? 위의 편집을 참조하십시오. –

+0

예 값이 null입니다. –

1

: 나는 당신의 MenuType 클래스가 어떤 변수에 대한 지식없이이 답변을 게시 한. 귀하의 질문에 추가하십시오 및 당신에 따라이 답변을 편집합니다 MenuType 클래스

모든 드롭 다운 값 및 텍스트 쌍의 모음입니다.

<select> 
<option value=1>TEXT 1</option> 
<option value=2>TEXT 2</option> 
<option value=3>TEXT 3</option> 
</select> 

당신은 MenuType에서 값 List<MenuType>의 목록을 가지고 드롭 다운 목록에 표시 할합니까?

가정 당신은 MenuType.cs로 이것을 가지고

public class MenuType 
{ 
    public int MenuTypeId {get;set;} 
    public string Name {get;set;} 

} 

당신의 드롭 다운은 다음과 같이 생성한다 :

보기에서
public ActionResult Index() 
    { 
     Dictionary<int,string> ctypelist = db.ContractTypes.OrderBy(x => x.TypeOfContract).ToDictionary(s => s.MenuTypeId, s=> s.Name); 


IEnumerable<SelectListItem> selectListItems = ctypelist.Select(s => new SelectListItem() { Value = s.Key.ToString(), Text = s.Value }); 

     ViewBag.DropDownTypeOfContract = selectListItems; 
     return View(); 
    } 

는 :

@{ 
var items = (IEnumerable<SelectListItem>) ViewBag.DropDownTypeOfContract; 
} 

    @Html.DropDownList("Codes", items , "Select Item") 
+0

'System.Collections.Generic.IEnumerable '첫 줄에 오류가 발생합니다. 'IEnumarable'에 대한 정의가없고 'System.Collections.Generic.IEnumerable '유형의 첫 번째 인수를 허용하는 'IEnumarable'확장 메서드가 없습니다 (using 지시문이 없거나 어셈블리 참조?) ' –

+0

@AbuHamzah 맞춤법 오류 나 한테 : 올바른 : IEnumerable –

+0

맞춤법 검사를 먼저해야합니다. lol, 다른 오류가 발생했습니다.'System.Collections.Generic.Dictionary '형식을 암시 적으로 변환 할 수 없습니다. 'System.Collections.Generic.List '\t ' –

관련 문제