Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “IEnumerable”类型的ViewData项没有键为“Geslacht”的项_C#_Razor_Asp.net Mvc 5 - Fatal编程技术网

C# “IEnumerable”类型的ViewData项没有键为“Geslacht”的项

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

首先,我是C,Razor,ASP.NET的初学者。。。我想为有“列表”的性别制作一个“下拉列表”,但问题是我得到了标题中描述的错误消息。这是我的密码:

模型

控制器

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中声明它。不过,谢谢你指出这一点:!