1

我有一个看法。在视图中我有几个月的字段(数据库中的 nvarchar 类型):

         @Html.DropDownListFor(model => model.rent_month,               
         (IEnumerable<SelectListItem>)ViewBag.months)

我在模型类(PostManager)中有一个方法来生成月份列表,例如:

          public IEnumerable<SelectListItem> GetMyMonthList()
         {
           return CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
            .Select(m => new SelectListItem() { Text = m, Value = m });
         }

我有几个月的时间采取行动:

     public ActionResult Create()
    {
       PostModel p = new PostModel();

     ViewBag.months = pm.GetMyMonthList();
       return View(p);
     }

在我的模型中,我的月份属性:

    [Required(ErrorMessage = "You Must Select a Month.")]
    [Display(Name = "Select Rent Month")]
    public string rent_month { get; set; }

在发布动作中:

      public ActionResult Create(PostModel p)
       {
         if (ModelState.IsValid)
            {
             post post = new Models.DB.post();
                 post.rent_month = p.rent_month;  
               db.posts.AddObject(post);
                    db.SaveChanges();
            }
        }     

它在下拉列表中正确生成月份。但是在提交表单后它给出了错误:

具有键“rent_month”的 ViewData 项的类型为“System.String”,但必须为“IEnumerable”类型

现在这个错误的解决方案是什么......提前谢谢......

4

2 回答 2

0

我相信这种情况正在发生,因为在您的发布操作中,您不会再次填充 ViewBag。确保您ViewBag.months = pm.GetMyMonthList();在控制器中设置的 POST 操作类似于您在 GET 操作中所做的操作。

更好的解决方案是将IEnumerable<SelectListItem> MonthList属性作为 PostModel 的一部分。您可以通过 MonthList 属性直接访问它,而不是从 ViewBag 加载月份

在 PostModel 中

    public IEnumerable<SelectListItem> MonthList
    {
        get
        {
            return pm
                .GetMonthList()
                .Select(a => new SelectListItem
                {
                    Value = a.Id,
                    Text = a.MonthText
                })
                .ToList();
        }
    }

然后在视图中

@Html.DropDownListFor(model => model.rent_month, Model.MonthList)

编辑问题后

你的 PostModel 类应该是这样的。我已将您的 GetMyMonthList() 实现移出 PostManager 类。

    public class PostModel
    {
        [Required(ErrorMessage = "You Must Select a Month.")]
        [Display(Name = "Select Rent Month")]
        public string rent_month { get; set; }

        public IEnumerable<SelectListItem> MonthList
        {
            get
            {
                return CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
                 .Select(m => new SelectListItem() { Text = m, Value = m });
            }
        }
    }
于 2012-05-07T04:56:17.153 回答
0
 public class PostModel
    {
        [Required(ErrorMessage = "You Must Select a Month.")]
        [Display(Name = "Select Rent Month")]
        public string rent_month { get; set; }

        public IEnumerable<SelectListItem> MonthList
        {
            get
            {
                return CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
                 .Select(m => new SelectListItem() { Text = m, Value = m });
            }
        }
    }
于 2016-02-29T09:52:51.690 回答