'xxx'키가있는 'IEnumerable <SelectListItem>'유형의 ViewData 항목이 없습니다.


87

Stack Overflow에 대한 몇 가지 게시물이 있지만 현재 상황에서 문제를 해결하는 것처럼 보이는 답변이 없습니다.

테이블이있는 페이지가 있고 각 행에는 여러 텍스트 필드와 드롭 다운이 있습니다. 모든 드롭 다운은 동일한 SelectList 데이터를 사용해야하므로 다음과 같이 설정했습니다.

제어 장치

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

전망

<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>

이 설정을 여러 곳에서 정확히 사용했지만이 특정보기에서 어떤 이유로 인해 오류가 발생합니다.

'submarket_0'키가있는 'IEnumerable'유형의 ViewData 항목이 없습니다.


1
이거 해봤 어? <%= Html.DropDownList("submarket_0", ((SelectList)ViewData["Submarkets"]).Items, "(none)") %>DropDownList는 IEnumerable<SelectListItem>.
— LukLed

@LukLed-이것이 실제로 다른 게시물의 정보뿐만 아니라 오류의 원인을 발견 한 방법입니다! 감사합니다
— Jimbo

<%= Html.DropDownList("submarket_0", ViewData["Submarkets"] as IEnumerable<SelectListItem>, "(none)") %>
— Arvis

오늘 이것을 만났고 아래 @jonathansewell의 결과에 따라 DropDownList 도우미의 두 번째 인수가 null임을 발견했습니다.
— Ken Palmer

답변:


79

좋아, 대답은이 문제에 대한 다른 게시물에서 파생되었으며 다음과 같습니다.

당신이 경우 ViewData를 포함 SelectList하여 같은 이름을 가진 DropDownList, 즉 "submarket_0"는 HTML은 도우미가 자동으로 채워집니다 DropDownList데이터로 는 두번째 매개 변수를 지정하지 않은 경우 이 경우 소스 selectList의입니다.

내 오류로 발생한 일은 다음과 같습니다.

드롭 다운 목록이 포함 된 테이블이 부분보기에 있고 ViewData가 변경되어 더 이상 SelectList참조한 I를 포함하지 않았기 때문에 HtmlHelper(오류를 발생하는 대신) ViewData (GRRRR!)에서 "submarket_0"이라는 SelectList를 찾으려고했습니다. !!) 여전히 찾을 수 없으며 오류가 발생했습니다. :)

내가 틀렸다면 나를 고쳐주세요


105
드롭 다운 목록에 대한 SelectListItems 컬렉션이 null이기 때문에이 오류가 발생했습니다. 이는 제가 생각했던 것과 동일한 문제입니다.
— Jonathan Sewell

6
이 문제에 직면 한 다른 사람들의 경우 드롭 다운 목록을 null 검사 (예 : @if (ViewData [ "Submarkets"]! = null))로 일시적으로 래핑합니다. 그런 다음보기가 오류를 발생시키지 않고 (드롭 다운 목록없이) 렌더링되면 문제를 식별 한 것입니다. 이 경우 "보기 데이터 항목 없음"오류는 매우 오해의 소지가 있습니다.
— GDB

나는 Ajax.ActionLink. 단지를 추가 SelectList Get받는 ActionMethodAjax 호출을 포함하는.
— 악취

네! 컨트롤러에서 ViewData로 전달하는 목록의 이름을 변경했지만보기에서 변경하지 않았습니다. 정말 몹시 혼란스러운 오류 메시지입니다!
— neminem

1
@JonathanSewell 감사합니다, 감사합니다, 감사합니다! 이것은 내 정확한 문제였습니다.
— johnw182

30

오래된 질문이지만 여기에 문제에 대한 또 다른 설명이 있습니다. 강력한 형식의 뷰가 있고 드롭 다운 목록을 만드는 데 ViewData를 사용하지 않는 경우에도이 오류가 발생합니다. MVC 소스 를 보면 오류의 원인이 명확해질 수 있습니다 .

// If we got a null selectList, try to use ViewData to get the list of items.
if (selectList == null)
{
    selectList = htmlHelper.GetSelectData(name);
    usedViewData = true;
}

따라서 다음과 같은 것이 있다면 :

@Html.DropDownList("MyList", Model.DropDownData, "")

그리고 Model.DropDownDatanull이면 MVC는 ViewData에서 이름이 지정된 항목을 찾고 MyList해당 이름을 가진 ViewData에 개체가 없으면 오류를 발생시킵니다.


1
안녕하세요, 이것도 제 문제입니다 . 목록이 null이면 어떻게해야하나요 ! 당신이 뭔가, 제안 할 수 있습니다
— 변압기

4
@transformer 가장 쉬운 방법은 Model.DropDownData를 null 대신 빈 목록으로 설정하는 것입니다. 가능하지 않은 경우 목록이 null인지 확인하기 위해 면도기 마크 업을 변경하고, 그렇다면 빈 선택 목록을 렌더링 할 수 있습니다.
— hawkke

15

나는 같은 오류가 있었는데, 문제는 잘못된 키 이름을 제공하기 때문에 오류 텍스트가 혼란 스럽다는 것 입니다.

귀하의 경우 "Submarkets"키가있는 'IEnumerable'유형의 ViewData 항목이 없습니다. "라고 표시되어야합니다.

내 오류는 뷰 코드 ( "하위 시장")의 철자가 틀렸지 만 오류 텍스트는 나를 미치게 만들었습니다.

이 답변을 게시하는 이유는 저처럼이 오류를 찾는 사람들에게 IENumerable을 찾을 수 없다는 것 입니다. 문제는 IENumerable을 찾을 수 없다는 것입니다 (이 경우 "Submarkets"). 오류로 표시된 항목 ( "submarket_0")이 아닙니다 .

받아 들여지는 대답은 매우 흥미롭지 만 두 번째 매개 변수를 지정하지 않으면 규칙이 적용된다고 말했듯 이이 경우 지정되었지만 var를 찾을 수 없습니다 (귀하의 경우에는 viewdata가 없기 때문에 내 경우에는 var 이름을 잘못 입력했습니다)

도움이 되었기를 바랍니다!


9

문제는 제출 버튼 클릭시 포스트 백이 발생하기 때문입니다. 따라서 제출시 데이터를 게시하는 동안 View ()를 반환하기 전에 다시 작성하십시오.

ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");

3

네임 스페이스를 확인하십시오.

당신은 할당 할 수 있습니다 System.Web.Webpages.Html.SelectListItem을 대신, 컨트롤러에 System.Web.Mvc.SelectListItem .


1

이것도 괜찮습니다. 예 :
==> "NumberController"파일에서 :

public ActionResult Create([Bind(Include = "NumberId,Number1,Number2,OperatorId")] Number number)
{
    if (ModelState.IsValid)
    {
        ...
        ...
        return RedirectToAction("Index");
    }
    ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", 
                                "OperatorSign", number.OperatorId);                
    return View();
}

==> 파일보기 (Create.cshtml) :

<div class="form-group">
    @Html.LabelFor(model => model.Number1, htmlAttributes: new { @class = 
                   "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Number1, new { htmlAttributes = new { 
                        @class = "form-control" } })
        @Html.ValidationMessageFor(model => model.Number1, "", new { @class = 
                                   "text-danger" })
    </div>
</div>

이제이 문을 제거하면 :

ViewBag.OperatorId = new SelectList(db.Operators, "OperatorId", "OperatorSign", number.OperatorId);

(컨트롤러에서) 다음 문장 뒤에서 :

return View();

이 오류가 표시됩니다.

'OperatorId'키가있는 'IEnumerable'유형의 ViewData 항목이 없습니다.

* 따라서 이러한 진술이 존재하는지 확인하십시오. *


0

나 에게이 오류를 일으킨 문제는 데이터베이스에 새 행을 저장할 때 발생했지만 필드가 null이었습니다. 데이터베이스 테이블 디자인에서 해당 필드는 NULL이 아닙니다. 따라서 null이 아닌 필드에 대해 null 값을 사용하여 새 행을 저장하려고 할 때 Visual Studio에서이 오류가 발생했습니다. 따라서 필드에 값이 할당되었는지 확인하고 문제가 해결되었습니다.


0

제 경우에는 실수로 게시 방법을 비공개로 설정했습니다. 비공개로 변경 한 후

[HttpPost]
private async Task<ActionResult> OnPostRemoveForecasting(){}

로 변경

[HttpPost]
public async Task<ActionResult> OnPostRemoveForecasting(){}

이제 잘 작동합니다.


0

원인은 객체의 부적절한 사용보다는 구문에 반하는 것이 아닙니다. ViewData, ViewBag 및 View의 개체 수명주기는 세션보다 짧습니다. 전자에 정의 된 데이터는 요청-응답 후 손실됩니다 (요청-응답 후 액세스를 시도하면 예외가 발생합니다). 따라서 전자는 View와 Controller간에 데이터를 전달하는 데 적합하고 후자는 임시 데이터를 저장하는 데 적합합니다. 임시 데이터는 여러 번 액세스 할 수 있도록 세션에 저장되어야합니다.


-1

제 경우에는 네임 스페이스에 충돌이있었습니다.

using System.Web.Mvc;

과

using System.Collections.Generic;

Mvc를 명시 적으로 사용하고 싶으므로 다음과 같이 선언했습니다.

new System.Web.Mvc.SelectList(...)

1
내 눈이 나를기만하지 않는 한, 어떤이 없습니다 SelectList에서 System.Collections.Generic.
— Erik Philips
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.