iT邦幫忙

0

沒有型別為 'IEnumerable<SelectListItem>' 且具有索引鍵xxx 的ViewData 項目

請問,我自製一個下拉式元件,在controller程式碼:
List mySelectItemListY = new List();
mySelectItemListY.AddRange(new[]{
new SelectListItem() {Text = Y1.ToString(), Value = Y1.ToString(), Selected = true},//Selected = true
});

for (int i = 0; i < 2; i++)
    {
      Y1 = Y1 - 1;
      mySelectItemListY.AddRange(new[]{

new SelectListItem() {Text = Y1.ToString(), Value = Y1.ToString(), Selected = false},});
}
ViewBag.YEAR = mySelectItemListY;

而在view程式碼:
@Html.DropDownList("YEAR")

我想抓到這下拉式的值,但它一直錯誤訊息:
HResult=0x80131509
Message=沒有型別為 'IEnumerable' 且具有索引鍵 'YEAR' 的 ViewData 項目。

請問,我該怎麼修正我錯誤的地方呢?謝謝

https://ithelp.ithome.com.tw/upload/images/20181205/20101506bBvj8YbByQ.jpg

網頁執行的出來,但我按「查詢」想試試能不能抓到值,就出現這訊息。

「HResult=0x80131509
Message=沒有型別為 'IEnumerable' 且具有索引鍵 'YEAR' 的 ViewData 項目。
Source=System.Web.Mvc」

看更多先前的討論...收起先前的討論...
Homura iT邦高手 1 級 ‧ 2018-12-05 15:07:12 檢舉
你這樣寫編譯過的了?
List<T>不是一個泛型嗎?
satan5304 iT邦新手 5 級 ‧ 2018-12-05 17:28:44 檢舉
嗯。我補充了,執行網頁是可以,但按「查詢」就有狀況。
優悠 iT邦新手 3 級 ‧ 2018-12-06 09:28:57 檢舉
最後面改這樣看看
ViewBag.YEAR = new SelectList(mySelectItemListY, "Value", "Text", "");
satan5304 iT邦新手 5 級 ‧ 2018-12-06 09:39:13 檢舉
嗯,我把controller後面修改了,html那邊不變嗎?
我一樣寫「 起始日期 - 年: @Html.DropDownList("YEAR")」
但執行還是一樣的錯誤訊息。
satan5304 iT邦新手 5 級 ‧ 2018-12-06 09:47:20 檢舉
請問,會不會是與我在html那邊開頭抓取的關係!
@model IEnumerable<XXX.Controllers.XXXController>
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
暐翰
iT邦大師 1 級 ‧ 2018-12-05 15:23:39

不要使用dynamic做泛型,請使用SelectListItem

Controller

using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var Y1 = 2;
        var mySelectItemListY = new List<SelectListItem>();
        mySelectItemListY.AddRange(new[]{
            new SelectListItem() {Text = Y1.ToString(), Value = Y1.ToString(), Selected = true},//Selected = true
        });
        for (int i = 0; i < 2; i++)
        {
            Y1 = Y1 - 1;
            mySelectItemListY.AddRange(new[]{
                new SelectListItem() {Text = Y1.ToString(), Value = Y1.ToString(), Selected = false}
            });
        }
        ViewBag.YEAR = mySelectItemListY.AsEnumerable();
        return View();
    }
}

View:

@{Layout = null;}
@Html.DropDownList("YEAR")

結果:
2018-12-05.15.22.44-image.png

看更多先前的回應...收起先前的回應...
satan5304 iT邦新手 5 級 ‧ 2018-12-05 16:06:11 檢舉

不過,我按,按鈕後,一樣出現「System.InvalidOperationException: '沒有型別為 'IEnumerable' 且具有索引鍵 'YEAR' 的 ViewData 項目。'」

satan5304 iT邦新手 5 級 ‧ 2018-12-05 16:16:02 檢舉

請教,我前面設計:
int YEAR = Int32.Parse(date.Year.ToString());//抓取今年度
int Y1 = YEAR - 1911;//換數民國年

SelectListItem,只能設定固定值嗎?
不好意思,剛學,有很多認知不足。謝謝

攻城屍 iT邦新手 4 級 ‧ 2018-12-05 17:20:39 檢舉

表單送出後驗證失敗你有重塞資料回 ViewBag 嗎?

satan5304 iT邦新手 5 級 ‧ 2018-12-05 17:23:37 檢舉

請問,你說的是這段嗎?
[HttpPost]//用戶端使用POST方法向伺服器端發送需求
public ActionResult Index(string Uid,string YEAR)
{.........}

不好意思,我第一次寫這功能,做查詢動作。不清楚的地方,請見諒。

優悠 iT邦新手 3 級 ‧ 2018-12-06 09:28:07 檢舉

已刪除

1
Floralt 昀翰
iT邦新手 4 級 ‧ 2022-04-14 18:40:21

稍微整理一下自己遇到的結論 :
1 表單提交的時候 post 驗證有誤,觸發 return view()
2 渲染 view 的時候,這時候沒給 viewbag 或 viewdata 給值
3 @html 檢查到空無一物的時候抱錯

解法 :
post 的 action 也要給 viewbag 或 viewdata值

我要發表回答

立即登入回答