【问题标题】:The ViewData item that has the key 'GenderID' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'具有键“GenderID”的 ViewData 项属于“System.Int32”类型,但必须属于“IEnumerable<SelectListItem>”类型
【发布时间】:2016-03-21 06:37:15
【问题描述】:

当我尝试提交/发布数据时发生错误......有人可以帮助我尝试每个帖子,但他们没有帮助我。我是 mvc 的新手...任何帮助都将被授予 这是我的代码...

public ActionResult Create()
{
   UserProfileCreateViewModel model = new UserProfileCreateViewModel();
   model.Gender = _GenderRepository.GetAll()
       .Select(x => new SelectListItem
       {
           Value = x.ID.ToString(),
           Text = x.DESCRIPTION
       });
   return View(model);
}

[HttpPost]
public ActionResult Create(UserProfileCreateViewModel model)
{
   if (ModelState.IsValid)
   {
      UserProfile user = new UserProfile();
      user.GENDER_ID = model.GenderID;
      _UserProfileRepository.Add(user);
      _UserProfileRepository.Save();
      return RedirectToAction("Index", "Home");
   }
   return View(model);
}

查看

<div class="form-group">
   @Html.LabelFor(model => model.GenderID, new { @class = "control-label col-md-2" })
   <div class="col-md-10">
      @Html.DropDownListFor(model => model.GenderID, Model.Gender, "Select from List", new { @class = "form-control" })
      @Html.ValidationMessageFor(model => model.GenderID, string.Empty, new { @class = "text-danger" })
   </div>
</div>

型号

public class UserProfileCreateViewModel
{
   [Required(ErrorMessage="{0} is required")]
    [Display(Name="Gender")]
    public int GenderID { get; set; }
    public IEnumerable<SelectListItem> Gender { get; set; }
}

InvalidOperationException:具有键“GenderID”的 ViewData 项属于“System.Int32”类型,但必须属于“IEnumerable”类型。

这里我试过这个...... // POST: /UserProfile/Create/

 [HttpPost]
    public ActionResult Create(UserProfileCreateViewModel model)
    {
        if (ModelState.IsValid)
        {
            UserProfile user = new UserProfile();

            user.GENDER_ID = model.GenderID;

            _UserProfileRepository.Add(user);
            _UserProfileRepository.Save();

            return RedirectToAction("Index", "Home");
        }
        model.Gender = _GenderRepository.GetAll().Select(x =>
                                                    new SelectListItem
                                                    {
                                                        Value = x.ID.ToString(),
                                                        Text = x.DESCRIPTION
                                                    });
        return View(model);
    }

【问题讨论】:

  • 添加您的堆栈跟踪或至少指出引发异常的位置。
  • 异常在 View At this line @Html.DropDownListFor(model => model.GenderID, Model.Gender, "Select from List", new { @class= "form-control" })
  • 我很确定您将错误的参数传递给 DropDownListFor 函数。我认为你应该在那里的某个地方创建一个新的 SelectList...
  • 我在另一个项目中以同样的方式创建了下拉列表,它在那里工作正常,但在这里不工作。

标签: c# asp.net-mvc


【解决方案1】:

错误意味着Model.Gender 的值是null(因此DropDownListFor() 方法期望第一个参数是IEnumerable&lt;SelectListItem&gt;

在您的情况下,当您提交表单并且ModelState 无效时,您返回视图并且没有为Model.Gender 分配值(因此它是null 并且抛出异常。

确保在返回视图之前在 POST 方法中重新分配 Model.Gender 的值(就像在 GET 方法中所做的那样)。

【讨论】:

  • 当然可以。编辑您的问题以添加您尝试过的新代码,以便我更正它。
  • 我已经回滚了您的更改(您无法更改原始问题 - 答案和 cmets 没有任何意义)。而是将您尝试过的新代码添加到问题的末尾。
  • 您显示的修改后的代码可以正常工作(它似乎与您在 GET 方法中设置值的代码相同)。因此,如果不是,那么您已经完成了其他操作,即将Model.Gender 的值设置为null。我建议你在视图中添加一个&lt;div&gt;@Model.Gender.ToString()&lt;/div&gt; 并在其上放置一个断点,看看你是否得到一个NullReferenceException
  • 它没有给出 NullReferenceException
  • 那么你修改后的代码就可以正常工作了!可以显示该特定错误的唯一方法是 Model.Gender 的值是否为 null (如果您想要一个指向源代码的链接,以便您可以逐步完成并证明它,那么请告诉我)跨度>
【解决方案2】:

这可能是“性别”之间的问题:

[Display(Name="Gender")]
public int GenderID { get; set; }

public IEnumerable<SelectListItem> Gender { get; set; }

如果我没记错的话,MVC 会尝试自动映射字段。尝试在(Name="GenderID") 中重命名(Name="Gender") 或在IEnumerable&lt;SelectListItem&gt; GenderEnumeration 中重命名IEnumerable&lt;SelectListItem&gt; Gender

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 2014-11-13
    • 2023-03-12
    • 2018-07-24
    • 1970-01-01
    • 2015-09-18
    相关资源
    最近更新 更多