[asp.net-mvc] ‘MY KEY’키가있는 ViewData 항목은 ‘System.String’유형이지만 ‘IEnumerable <SelectListItem>’유형이어야합니다.

ASP.NET MVC 2를 사용하여 Linq-2-SQL로 매핑 된 데이터베이스에서 드롭 다운 목록을 채우려 고하는데이 오류가 계속 발생합니다.

IEnumerable<SelectListItem>두 번째 줄 에 유형 변수를 선언했기 때문에 혼란 스럽지만 오류로 인해 이것이 사실이 아니라고 생각합니다. 나는 이것이 매우 간단해야한다고 생각하지만 어려움을 겪고 있습니다. 도움을 주시면 감사하겠습니다.

내 컨트롤러의 흥미로운 부분은 다음과 같습니다.

public ActionResult Create()
{
    var db = new DB();
    IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
        b => new SelectListItem { Value = b.basetype, Text = b.basetype });
    ViewData["basetype"] = basetypes;
    return View();
}

그리고 여기 내 흥미로운 부분이 있습니다.

<div class="editor-label">
   <%: Html.LabelFor(model => model.basetype) %>
</div>
<div class="editor-field">
   <%: Html.DropDownList("basetype") %>
   <%: Html.ValidationMessageFor(model => model.basetype) %>
</div>

다음은 양식을 제출할 때 POST 조치입니다.

// POST: /Meals/Create
[HttpPost]
public ActionResult Create(Meal meal)
{
    if (ModelState.IsValid)
    {
        try
        {
            // TODO: Add insert logic here
            var db = new DB();
            db.Meals.InsertOnSubmit(meal);
            db.SubmitChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            return View(meal);
        }
    }
    else
    {
        return View(meal);
    }
}

감사.



답변

나는 같은 문제가 있었고 마침내 대답을 얻었습니다 …

문제는 POST 조치에서 양식을 제출 한 후 ModelState가 유효하지 않거나 try / catch에서 오류를 발견하여보기가 리턴된다는 것입니다. 그러나 이번에는보기가 ViewData["basetype"]올바르게 설정 되지 않았습니다 .

이전에 사용한 것과 동일한 코드로 다시 채워야하므로이를 반복하십시오.

var db = new DB();
IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
    b => new SelectListItem { Value = b.basetype, Text = b.basetype });
ViewData["basetype"] = basetypes;

전과 return View(meal)[HttpPost]방법.

정확히 이것은 당신의 문제를 해결할 것입니다 :

[HttpPost]
public ActionResult Create(Meal meal)
{
    if (ModelState.IsValid)
    {
        try
        {
            // TODO: Add insert logic here
            var db = new DB();
            db.Meals.InsertOnSubmit(meal);
            db.SubmitChanges();
            return RedirectToAction("Index");
        }
        catch
        {
            var db = new DB();
            IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
               b => new SelectListItem { Value = b.basetype, Text = b.basetype });
            ViewData["basetype"] = basetypes;
            return View(meal);
        }
    }
    else
    {
        var db = new DB();
        IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(
            b => new SelectListItem { Value = b.basetype, Text = b.basetype });
        ViewData["basetype"] = basetypes;
        return View(meal);
    }
}

나는이 질문이 매우 오래되었다는 것을 알고 있지만 오늘 같은 문제로 여기에 왔으므로 나중에 다른 사람들이 여기에 올 수 있습니다 …


답변

SelectList가 null 인 경우이 오류가 발생합니다.


답변

방금이 문제를 겪었고이 기사가 도움이되었습니다 -http : //odetocode.com/Blogs/scott/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc. aspx

Po 이후에 컬렉션이 다시 채워질 가능성이 가장 높습니다.


답변

향후 독자를 위해 면도기를 사용하는 경우 선택 목록 항목 유형을 목록에서 IEnumerable로 변경하십시오.

에서

@Html.DropDownListFor(m => m.id, ViewBag.SomeList as List<SelectListItem>)

@Html.DropDownListFor(m => m.id, ViewBag.SomeList as IEnumerable<SelectListItem>)


답변

드롭 다운 목록의 이름에 대한 문자열을 첫 번째 매개 변수로 추가하고 항목을 뷰 데이터에서 가져옵니다.

 <%= Html.DropDownList("SomeDropdownName", (IEnumerable<SelectListItem>)ViewData["basetype"]) %>

다음은 또한 사용할 수있는 확장 방법이므로 드롭 다운 목록은 다른 컨트롤을 수행 한 방법과 유사한 스타일로 설정됩니다.

        public static string DropDownList<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel)
        where TModel : class
    {
        string inputName = ExpressionHelper.GetInputName(expression);
        return htmlHelper.DropDownList(inputName, selectList, optionLabel);
    }

예를 들어

<%= Html.DropDownList(x => x.BaseType, (IEnumerable<SelectListItem>)ViewData["basetype"], "")%>


답변

컬렉션을 ViewData 사전의 항목으로 설정하고 모델의 속성으로 검색하려고합니다. 간단한 수정은 설정 한 것과 같은 방식으로 참조하는 것입니다.

    <%var basetype = ViewData["basetype"] as IEnumerable<SelectListItem>;%>
    <div class="editor-label">
        <%: Html.Label("basetype") %>
    </div>
    <div class="editor-field">
        <%: Html.DropDownList("basetype", basetype) %>
        <%: Html.ValidationMessage("basetype") %>
    </div>

또는 아래 코드는 강력한 형식의 뷰를 사용합니다.

public class ViewModel {
   //Model properties
   public IEnumerable<SelectListItem> basetype {get;set;}
}

public ActionResult Create()
    {
        var db = new DB();
        IEnumerable<SelectListItem> basetypes = db.Basetypes.Select(b => new SelectListItem { Value = b.basetype, Text = b.basetype });
        return View(new ViewModel { basetype=basetypes });
    }

그런 다음 강력하게 입력 한 관점에서 :

    <div class="editor-label">
        <%: Html.LabelFor(model => model.basetype) %>
    </div>
    <div class="editor-field">
        <%: Html.DropDownListFor(model=>model.basetype) %>
        <%: Html.ValidationMessageFor(model => model.basetype) %>
    </div>


답변

Html.DropDownList()메소드 를 사용 하는 경우 @Peto가 응답 한 것처럼 ViewData / Viewbag 항목이 설정되지 않은 경우 동일한 오류가 발생할 수 있습니다.

그러나 컨트롤러 설정 항목의 경우 올바르게 설정되지 않을 수 있지만 주보기에서는 새로운 ViewDataDictionary 값으로 부분 viw 호출을 사용합니다.

당신이있는 경우 @Html.Partial("Partianame", Model,new ViewDataDictionary() { /* ... */ })다음 부분보기가 표시되지 않습니다 ViewDataViewBag데이터 제거 new ViewDataDictionary()매개 변수