C# “IEnumerable”类型的ViewData项没有键为“Geslacht”的项
首先,我是C,Razor,ASP.NET的初学者。。。我想为有“列表”的性别制作一个“下拉列表”,但问题是我得到了标题中描述的错误消息。这是我的密码: 模型 控制器C# “IEnumerable”类型的ViewData项没有键为“Geslacht”的项,c#,razor,asp.net-mvc-5,C#,Razor,Asp.net Mvc 5,首先,我是C,Razor,ASP.NET的初学者。。。我想为有“列表”的性别制作一个“下拉列表”,但问题是我得到了标题中描述的错误消息。这是我的密码: 模型 控制器 namespace Hoofdstuk5_MvcStudentForm1.Controllers { public class StudentController : Controller { // GET: Student/Index public ActionResult Inde
namespace Hoofdstuk5_MvcStudentForm1.Controllers
{
public class StudentController : Controller
{
// GET: Student/Index
public ActionResult Index()
{
return View();
}
// GET: Student/Index
[HttpPost]
public ActionResult Index(string groep)
{
ViewBag.Geslacht = new List<SelectListItem>
{
new SelectListItem { Text = "Female", Value = "1" },
new SelectListItem { Text = "Male", Value = "2" }
};
return View(groep);
}
}
}
看法
第二个'DropDownListFor'可以工作,但是第一个和第三个必须来自控制器,但是它不工作,我不知道为什么?有人能帮我吗?您正在向视图发送一个字符串作为模型:
return View(groep);
因此,您将得到该错误。必须将模型传递给视图。创建一个如下所示的模型:
// Give this a better name
public class SomeModel
{
public List<SelectListItem> Geslacht { get; set; }
}
然后将控制器代码更改为:
// GET: Student/Index
[HttpPost]
public ActionResult Index(string groep)
{
var model = new SomeModel();
model.Geslacht = new List<SelectListItem>
{
new SelectListItem { Text = "Female", Value = "1" },
new SelectListItem { Text = "Male", Value = "2" }
};
return View(model);
}
如果需要更多内容,只需向模型添加更多属性。您将向视图发送一个字符串作为模型:
return View(groep);
因此,您将得到该错误。必须将模型传递给视图。创建一个如下所示的模型:
// Give this a better name
public class SomeModel
{
public List<SelectListItem> Geslacht { get; set; }
}
然后将控制器代码更改为:
// GET: Student/Index
[HttpPost]
public ActionResult Index(string groep)
{
var model = new SomeModel();
model.Geslacht = new List<SelectListItem>
{
new SelectListItem { Text = "Female", Value = "1" },
new SelectListItem { Text = "Male", Value = "2" }
};
return View(model);
}
如果需要更多内容,只需向模型添加更多属性。该错误意味着DropDownListFor IEnumerable的第二个参数为null,因此该方法希望第一个参数为IEnumerable,而不是IEnumerable 在第一个示例中,ViewBag.Geslacht的值为null,因为您没有在GET方法中填充它,尽管您在POST方法中填充了它。添加ViewBag.Geslacht=新列表。。。获取方法
在第三个示例中,您安全地将第二个参数设置为null该错误意味着DropDownListFor IEnumerable的第二个参数为null,因此该方法希望第一个参数为IEnumerable,而不是 在第一个示例中,ViewBag.Geslacht的值为null,因为您没有在GET方法中填充它,尽管您在POST方法中填充了它。添加ViewBag.Geslacht=新列表。。。获取方法
在第三个示例中,您安全地将第二个参数设置为null,我建议您稍微更改一下模型:
public class StudentViewModel
{
public string Geslacht { get; set; }
public IEnumerable<SelectListItem> Geslachts { get; set; }
public StudentViewModel()
{
Geslachts = GetGeslachts();
}
public StudentViewModel(string geslacht)
{
Geslacht = geslacht;
Geslachts = GetGeslachts();
}
private IEnumerable<SelectListItem> GetGeslachts()
{
return new List<SelectListItem>
{
new SelectListItem
{
Text = "Select ---",
Value = string.Empty
},
new SelectListItem
{
Text = "Male",
Value = "1"
},
new SelectListItem
{
Text = "Female",
Value = "2"
}
}
}
}
进行此更改还需要更改视图,以接受StudentViewModel。现在,在您看来,您可以拥有以下内容:
@model oofdstuk5_MvcStudentForm1.Models.ViewModels.StudentViewModel
@Html.DropDownListFor(model=>model.Geslacht, Model.Geslachts, new { htmlAttributes = new { @class = "form-control" } )
我建议您稍微改变一下您的型号:
public class StudentViewModel
{
public string Geslacht { get; set; }
public IEnumerable<SelectListItem> Geslachts { get; set; }
public StudentViewModel()
{
Geslachts = GetGeslachts();
}
public StudentViewModel(string geslacht)
{
Geslacht = geslacht;
Geslachts = GetGeslachts();
}
private IEnumerable<SelectListItem> GetGeslachts()
{
return new List<SelectListItem>
{
new SelectListItem
{
Text = "Select ---",
Value = string.Empty
},
new SelectListItem
{
Text = "Male",
Value = "1"
},
new SelectListItem
{
Text = "Female",
Value = "2"
}
}
}
}
进行此更改还需要更改视图,以接受StudentViewModel。现在,在您看来,您可以拥有以下内容:
@model oofdstuk5_MvcStudentForm1.Models.ViewModels.StudentViewModel
@Html.DropDownListFor(model=>model.Geslacht, Model.Geslachts, new { htmlAttributes = new { @class = "form-control" } )
可能是因为在发布数据时只设置了ViewBag.Geslacht。当你获取数据时,你可能应该添加它,而不是将它放在另一个没有参数的索引方法中。谢谢你的回答:@KevinN你所做的很奇怪。我不知道为什么要这样做3次:@Html.DropDownListFormodel=>model。Geslacht@CodingYoshi这是我们在学校必须做的一个练习,如何用三种不同的方式来做:可能是因为在发布数据时只设置了ViewBag.Geslacht。当你获取数据时,你可能应该添加它,而不是将它放在另一个没有参数的索引方法中。谢谢你的回答:@KevinN你所做的很奇怪。我不知道为什么要这样做3次:@Html.DropDownListFormodel=>model。Geslacht@CodingYoshi这是一个我们在学校必须做的练习,如何用三种不同的方式来做:这对于OP的第二个例子来说毫无意义,意味着你永远得不到任何价值感谢你指出了这一点。老实说,我不知道为什么OP会对同一件事渲染相同的下拉列表三次。是的,你是对的。这对于OP的第二个例子来说毫无意义,这意味着你永远得不到任何价值。谢谢你指出这一点。老实说,我不知道为什么OP会对同一件事渲染相同的下拉列表三次。但你是对的,我要感谢你的回答。我把ViewBag.Geslacht放在第一个索引中,这意味着在第二个索引中什么都没有了。当我打开它时,它可以工作,但当我想保存表单时,它会给我与标题中相同的错误。如果返回视图,您还需要根据当前的代码重新填充POST方法。请参阅更详细的解释并注意,通常只返回视图is ModelState is invalid谢谢,它可以工作。只是问一下,有没有一种更简单的方法可以做到这一点,而不必重新填充两个操作,但思路相同?为了避免重复代码,请使用一个私有的void ConfigureViewModelStudentViewModel方法来设置ViewBag属性的值,但您的视图模型确实应该包含IEnumerable属性,而不是使用ViewBag。然后在GET方法中调用该方法,在POST方法中返回viewforthedetailexplainion+1,谢谢你的回答。我把ViewBag.Geslacht放在第一个索引中,这意味着在第二个索引中什么都没有了。当我打开它时,它会工作,但当我想保存表单时,它会给我
与标题中的错误相同。如果返回视图,还需要根据当前的代码重新填充POST方法。请参阅更详细的解释并注意,通常只返回视图is ModelState is invalid谢谢,它可以工作。只是问一下,有没有一种更简单的方法可以做到这一点,而不必重新填充两个操作,但思路相同?为了避免重复代码,请使用一个私有的void ConfigureViewModelStudentViewModel方法来设置ViewBag属性的值,但您的视图模型确实应该包含IEnumerable属性,而不是使用ViewBag。然后,在调用GET方法中的该方法时,在POST方法中,您将返回我提供的详细解释+1的视图。绑定到属性时,SelectListItem的Selected属性将被忽略,因此设置该属性毫无意义。谢谢,我将删除它。注意,您还可以使用@Html.DropDownListForm=>m.Geslacht,Model.Geslachts,Select--,新建{…}以添加空值option@StephenMuecke谢谢,我知道这一点,我更喜欢在ViewModel中声明它。不过,谢谢你指出这一点:!绑定到属性时,SelectListItem的Selected属性将被忽略,因此设置它毫无意义。谢谢,我将删除它。注意,您还可以使用@Html.DropDownListForm=>m.Geslacht,Model.Geslachts,Select--,new{…}添加空值option@StephenMuecke谢谢,我知道这一点,我更喜欢在ViewModel中声明它。不过,谢谢你指出这一点:!