'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.