C# (Html.DropdownList)值不能为空。参数名称:items

C# (Html.DropdownList)值不能为空。参数名称:items,c#,asp.net-mvc-5,C#,Asp.net Mvc 5,我有一个登录视图页面,其中包含两个部分视图\u LoginPartial和\u RegisterPartial。在\u RegisterPartial中,我有一个包含角色的dropdownlist @Html.DropDownListFor(m => m.CompanyProfile, new SelectList(ViewBag.CompanyProfiles, "AccountId", "AccountName"), "Select", new { @class = "form-co

我有一个登录视图页面,其中包含两个部分视图
\u LoginPartial
\u RegisterPartial
。在
\u RegisterPartial
中,我有一个包含角色的dropdownlist

 @Html.DropDownListFor(m => m.CompanyProfile, new SelectList(ViewBag.CompanyProfiles, "AccountId", "AccountName"), "Select", new { @class = "form-control" })
我正在用GET方法初始化这个dropdownlist,如下所示

 //
    // GET: /Account/Login
    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.CompanyProfiles = util.GetCompanyProfiles();
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }
我从数据库中获取列表的代码是

 public List<abo_AccountType> GetCompanyProfiles()
    {
        List<abo_AccountType> companyProfiles = new List<abo_AccountType>();
        companyProfiles = db.GetAccountTypes().ToList();
        return companyProfiles;
    }
即使我再次初始化下拉列表,我仍然得到
值不能为null的错误。参数名称:items
。 我在SO上搜索了几乎所有的答案,他们都说我需要再次初始化下拉列表,我正在这样做,那么为什么我仍然得到这个错误。

您应该为Register生成“GET”方法,并在其中设置CompanyProfiles

[HttpGet]
[AllowAnonymous]
public ActionResult Register()
{
    ViewBag.CompanyProfiles = util.GetCompanyProfiles();
    return View();
}

创建另一个同时具有这两个模型的属性的模型,并在post操作中传递它

[HttpGet]
[AllowAnonymous]
public ActionResult Register(combinedModel model)
{
    ViewBag.CompanyProfiles = util.GetCompanyProfiles();
    return View(model);
}

这样做会产生错误:
传递到字典中的模型项的类型为“LoginViewModel”,但此字典需要“RegisterViewModel”类型的模型项。
此外,我不能有单独的登录和注册视图,我需要将这两个模块放在同一页面上。我实际上是在试图避免这种情况。没有别的办法了吗?因为你的动作对应于2个模型。在我看来,你必须使用两种型号。你也在使用局部视图。这就是你应该使用视图模型概念的原因我使用的是视图模型,但是登录和注册视图模型是分开的,因为它们都有不同的业务逻辑,但是我想如果我找不到任何其他解决方案,我就必须将这两个都结合起来。确保你的get方法正确地传递了所需的模型,我检查了所有你的POST方法所做的是重定向。它不会返回视图,因此设置一个
ViewBag
属性是毫无意义的,而执行两次更是毫无意义。您显示的代码不会生成该错误-您没有显示的代码就是问题所在。@StephenMuecke好的,但所有的答案(关于其他问题)都表明我们需要在POST方法中再次填充下拉列表(当我的注册模块和登录模块处于不同视图时,这对我有效)当然,我这次也是这么做的,但在这种情况下不起作用。另外,当你否决某个问题时,请给出理由。是的,你需要重新填充它,然后返回视图。但是您没有返回视图-您重定向到另一个方法,因此
ViewBag.CompanyProfiles=util.GetCompanyProfiles()是没有意义的(在重定向时它就丢失了)。否决票是因为您没有显示相关的代码(最好的猜测是您的
Login()
方法中有一个下拉列表,并且是该方法引发了异常-您显示的代码不会引发异常)
[HttpGet]
[AllowAnonymous]
public ActionResult Register(combinedModel model)
{
    ViewBag.CompanyProfiles = util.GetCompanyProfiles();
    return View(model);
}