【问题标题】:ASP.NET Core 5 MVC: ArgumentNullException: Value cannot be null. (Parameter 'items')ASP.NET Core 5 MVC:ArgumentNullException:值不能为空。 (参数“项目”)
【发布时间】:2021-12-18 02:37:11
【问题描述】:

我在创建页面的 GET 方法中有这个列表:

List<string> users = (from c in _context.NR_Users select c.Name).ToList();
users.Insert(0, "Select");
ViewBag.users = users;

显示如下:

<div class="form-group col-md-4">
    <label class="control-label">Prepared By</label>
    <select asp-for="Prepared_By" name="Prepared_By" class="form-control" asp-items="@(new SelectList(ViewBag.users))"></select>
    <span asp-validation-for="Prepared_By" class="text-danger"></span>
</div>

在模型中Prepared_By是一个字符串。

点击提交时在创建页面上出现以下错误:

ArgumentNullException:值不能为空。 (参数“项目”)

指向

<select asp-for="Prepared_By" name="Prepared_By" class="form-control" asp-items="@(new SelectList(ViewBag.users))"></select>

关于这个问题,我发现有几件事非常有趣。首先,在创建页面的 POST 方法中,如果我打印 Prepared_By 的值,它总是会打印正确的名称:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ID,State_Project_Number,Federal_Project_Number,Name,Route_Number,County,Work_Type,Coordinates,Project_Description,Federal_Aid,Minimal_Project_Verification,CE_Category,Amms,Activities_Agreement,Arch_RE,Hist_RE,Arch_RE_Date,Hist_RE_Date,Through_Lanes,Close_Road,ROW_Acquisition,Access_Control,Fifty_Year_Structure,Agency_Coordination,IPAC_Screening_Zone,Section_404_Permit,Ground_Disturbance,Waterway,Special_Use_Permit,Floodplain,Prepared_By,Approved_By,Adduser,Date_Added")] TypeOne typeOne, bool Assessment)
{
    System.Diagnostics.Debug.WriteLine("Prepared by: " + typeOne.Prepared_By);

    if (ModelState.IsValid)
    {
        typeOne.Adduser = User.Identity.Name;
        typeOne.Date_Added = DateTime.Today;

        System.Diagnostics.Debug.WriteLine("Prepared by again: " + typeOne.Prepared_By);

        _context.Add(typeOne);
        await _context.SaveChangesAsync();
    }
}

但是,当我尝试在 if(ModelState.IsValid) 内再次打印它时,它不起作用。

还有什么有趣的是,我在不同的创建页面中使用了这个完全相同的列表,它工作得很好:

<div class="form-group col-md-3">
    <label class="control-label">DSN PM</label>
    <select asp-for="DSN_PM" name="DSN_PM" class="form-control" asp-items="@(new SelectList(ViewBag.users))"></select>
    <span asp-validation-for="DSN_PM" class="text-danger"></span>
</div>
public async Task<IActionResult> Create([Bind("ID,State_Project_Number,Federal_Project_Number,Project_Name,County,Memo_Date,From,Authorization,DSN_PM,History,History_PM,Review_Exempt_H,SHPO_Approval_H,Archaeology,Archaeology_PM,Review_Exempt_A,SHPO_Approval_A,ESA_Key,Crayfish,Crayfish_Habitat_Assessment,NLEB_4D,USFWS,USFWS_Type,Mussel_Habitat,Mussel_Stream,Within_Airport,ToPo_Quad_Name,Bat_Habitat,Bars,Coordinates,Natural_Resources_Notes,Adduser,Date_Added,Crayfish_Notes,Mussel_Notes")] Project_Screen project_Screen)
{
    if (ModelState.IsValid)
    {
        project_Screen.Adduser = User.Identity.Name;
        project_Screen.Date_Added = DateTime.Today;

        _context.Add(project_Screen);

        await _context.SaveChangesAsync();

        return RedirectToAction(nameof(Index));
    }

    return View(project_Screen);
}

在第二个示例中,我在 GET 方法中以完全相同的方式创建列表,但我从未遇到过这个问题。可能是什么问题?

编辑:从问题更新

控制器:

 [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("ID,State_Project_Number,Federal_Project_Number,Name,Route_Number,County,Work_Type,Coordinates,Project_Description,Federal_Aid,Minimal_Project_Verification,CE_Category,Amms,Activities_Agreement,Arch_RE,Hist_RE,Arch_RE_Date,Hist_RE_Date,Through_Lanes,Close_Road,ROW_Acquisition,Access_Control,Fifty_Year_Structure,Agency_Coordination,IPAC_Screening_Zone,Section_404_Permit,Ground_Disturbance,Waterway,Special_Use_Permit,Floodplain,Prepared_By,Approved_By,Adduser,Date_Added")] TypeOne typeOne, bool Assessment)
        {
            System.Diagnostics.Debug.WriteLine("Prepared by: " + typeOne.Prepared_By);
            if (ModelState.IsValid)
            {
                typeOne.Adduser = User.Identity.Name;
                typeOne.Date_Added = DateTime.Today;
                System.Diagnostics.Debug.WriteLine("Prepared by again: " + typeOne.Prepared_By);
                _context.Add(typeOne);
                await _context.SaveChangesAsync();
                return RedirectToAction(nameof(Index));
            }
            //set the data for ViewBag.users..
            List<string> users = (from c in _context.NR_Users select c.Name).ToList();
            users.Insert(0, "Select");
            ViewBag.users = users;
            return View(typeOne);
        }

查看:

<div class="form-group col-md-4">
                    <label class="control-label">Prepared By</label>
                    <select asp-for="Prepared_By" name="Prepared_By" class="form-control" asp-items="@(new SelectList(ViewBag.users,"Id","Name"))"></select>
                    <span asp-validation-for="Prepared_By" class="text-danger"></span>
                </div>

这里有几个问题。首先,问题仍然存在,没有任何改变。我不确定视图的代码是否正确,但它给了我一个Object reference not set to an instance of an object. 错误,但我真的不知道它指向什么。我也不知道您为什么要添加 ID,因为我不会在任何地方使用它,也不需要。

编辑 2:

GET方法:

// GET: TypeOnes/Create
        public IActionResult Create()
        {
            List<string> users = (from c in _context.NR_Users select c.Name).ToList();
            users.Insert(0, "Select");
            ViewBag.users = users;

            List<string> adminLeads = (from s in _context.NR_Users
                                      where s.User_Type == "Admin" || s.User_Type == "Unit Leader"
                                      select s.Name).ToList();
            adminLeads.Insert(0, "Select");
            ViewBag.adminLeads = adminLeads.ToList();

            List<SelectListItem> options = new()
            {
                new SelectListItem { Value = "True", Text = "Yes" },
                new SelectListItem { Value = "False", Text = "No" }
            };
            options.Insert(0, new SelectListItem { Value = "Select" });
            ViewBag.options = options;

            List<SelectListItem> assessments = new()
            {
                new SelectListItem { Value = "Mussel", Text = "Mussel" },
                new SelectListItem { Value = "Crayfish", Text = "Crayfish" },
                new SelectListItem { Value = "Both", Text = "Both" },
                new SelectListItem { Value = "No", Text = "No" }
            };
            assessments.Insert(0, new SelectListItem { Value = "Select" });
            ViewBag.options = assessments;

            List <SelectListItem> reTypes = new()
            {
                new SelectListItem { Value = "Appendix A short form", Text = "Appendix A short form" },
                new SelectListItem { Value = "Review exempt", Text = "Review exempt" },
                new SelectListItem { Value = "SHPO", Text = "SHPO" },
                new SelectListItem { Value = "Programatic Agreement", Text = "Programatic Agreement" }
            };
            reTypes.Insert(0, new SelectListItem { Value = "Select", Text = "Select" });
            ViewBag.reTypes = reTypes;

            List <SelectListItem> counties = new()
            {
                new SelectListItem { Value = "Barbour", Text = "Barbour County" },
                new SelectListItem { Value = "Berkeley", Text = "Berkeley County" },
                new SelectListItem { Value = "Boone", Text = "Boone County" },
                new SelectListItem { Value = "Braxton", Text = "Braxton County" },
                new SelectListItem { Value = "Cabell", Text = "Cabell County" },
                new SelectListItem { Value = "Calhoun", Text = "Calhoun County" },
                new SelectListItem { Value = "Clay", Text = "Clay County" },
                new SelectListItem { Value = "Doddridge", Text = "Doddridge County" },
                new SelectListItem { Value = "Fayette", Text = "Fayette County" },
                new SelectListItem { Value = "Gilmer", Text = "Gilmer County" },
                new SelectListItem { Value = "Grant", Text = "Grant County" },
                new SelectListItem { Value = "Greenbrier", Text = "Greenbrier County" },
                new SelectListItem { Value = "Hampshire", Text = "Hampshire County" },
                new SelectListItem { Value = "Hancock", Text = "Hancock County" },
                new SelectListItem { Value = "Hardy", Text = "Hardy County" },
                new SelectListItem { Value = "Harrison", Text = "Harrison County" },
                new SelectListItem { Value = "Jackson", Text = "Jackson County" },
                new SelectListItem { Value = "Jefferson", Text = "Jefferson County" },
                new SelectListItem { Value = "Kanawha", Text = "Kanawha County" },
                new SelectListItem { Value = "Lewis", Text = "Lewis County" },
                new SelectListItem { Value = "Lincoln", Text = "Lincoln County" },
                new SelectListItem { Value = "Logan", Text = "Logan County" },
                new SelectListItem { Value = "Marion", Text = "Marion County" },
                new SelectListItem { Value = "Marshall", Text = "Marshall County" },
                new SelectListItem { Value = "Mason", Text = "Mason County" },
                new SelectListItem { Value = "McDowell", Text = "McDowell County" },
                new SelectListItem { Value = "Mercer", Text = "Mercer County" },
                new SelectListItem { Value = "Mineral", Text = "Mineral County" },
                new SelectListItem { Value = "Mingo", Text = "Mingo County" },
                new SelectListItem { Value = "Monongalia", Text = "Monongalia County" },
                new SelectListItem { Value = "Monroe", Text = "Monroe County" },
                new SelectListItem { Value = "Morgan", Text = "Morgan County" },
                new SelectListItem { Value = "Nicholas", Text = "Nicholas County" },
                new SelectListItem { Value = "Ohio", Text = "Ohio County" },
                new SelectListItem { Value = "Pendleton", Text = "Pendleton County" },
                new SelectListItem { Value = "Pleasants", Text = "Pleasants County" },
                new SelectListItem { Value = "Pocahontas", Text = "Pocahontas County" },
                new SelectListItem { Value = "Preston", Text = "Preston County" },
                new SelectListItem { Value = "Putnam", Text = "Putnam County" },
                new SelectListItem { Value = "Raleigh", Text = "Raleigh County" },
                new SelectListItem { Value = "Randolph", Text = "Randolph County" },
                new SelectListItem { Value = "Ritchie", Text = "Ritchie County" },
                new SelectListItem { Value = "Roane", Text = "Roane County" },
                new SelectListItem { Value = "Summers", Text = "Summers County" },
                new SelectListItem { Value = "Taylor", Text = "Taylor County" },
                new SelectListItem { Value = "Tucker", Text = "Tucker County" },
                new SelectListItem { Value = "Tyler", Text = "Tyler County" },
                new SelectListItem { Value = "Upshur", Text = "Upshur County" },
                new SelectListItem { Value = "Wayne", Text = "Wayne County" },
                new SelectListItem { Value = "Webster", Text = "Webster County" },
                new SelectListItem { Value = "Wetzel", Text = "Wetzel County" },
                new SelectListItem { Value = "Wirt", Text = "Wirt County" },
                new SelectListItem { Value = "Wood", Text = "Wood County" },
                new SelectListItem { Value = "Wyoming", Text = "Wyoming County" }
            };
            ViewBag.counties = counties;

            return View();
        }

如果我在 POST 方法中重新创建每个列表,那么我不会在任何地方收到任何错误,它只是将我发送回创建页面并且不执行数据库插入

POST方法:

[HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create([Bind("ID,State_Project_Number,Federal_Project_Number,Name,Route_Number,County,Work_Type,Coordinates,Project_Description,Federal_Aid,Minimal_Project_Verification,CE_Category,Amms,Activities_Agreement,Arch_RE,Hist_RE,Arch_RE_Date,Hist_RE_Date,Through_Lanes,Close_Road,ROW_Acquisition,Access_Control,Fifty_Year_Structure,Agency_Coordination,IPAC_Screening_Zone,Section_404_Permit,Ground_Disturbance,Waterway,Special_Use_Permit,Floodplain,Prepared_By,Approved_By,Adduser,Date_Added")] TypeOne typeOne, string Assessment, bool Bat)
        {
            List<string> users = (from c in _context.NR_Users select c.Name).ToList();
            users.Insert(0, "Select");
            ViewBag.users = users;

            List<string> adminLeads = (from s in _context.NR_Users
                                       where s.User_Type == "Admin" || s.User_Type == "Unit Leader"
                                       select s.Name).ToList();
            adminLeads.Insert(0, "Select");
            ViewBag.adminLeads = adminLeads.ToList();

            List<SelectListItem> options = new()
            {
                new SelectListItem { Value = "True", Text = "Yes" },
                new SelectListItem { Value = "False", Text = "No" }
            };
            options.Insert(0, new SelectListItem { Value = "Select" });
            ViewBag.options = options;

            List<SelectListItem> assessments = new()
            {
                new SelectListItem { Value = "Mussel", Text = "Mussel" },
                new SelectListItem { Value = "Crayfish", Text = "Crayfish" },
                new SelectListItem { Value = "Both", Text = "Both" },
                new SelectListItem { Value = "No", Text = "No" }
            };
            assessments.Insert(0, new SelectListItem { Value = "Select" });
            ViewBag.assessments = assessments;

            List<SelectListItem> reTypes = new()
            {
                new SelectListItem { Value = "Appendix A short form", Text = "Appendix A short form" },
                new SelectListItem { Value = "Review exempt", Text = "Review exempt" },
                new SelectListItem { Value = "SHPO", Text = "SHPO" },
                new SelectListItem { Value = "Programatic Agreement", Text = "Programatic Agreement" }
            };
            reTypes.Insert(0, new SelectListItem { Value = "Select", Text = "Select" });
            ViewBag.reTypes = reTypes;

            List<SelectListItem> counties = new()
            {
                new SelectListItem { Value = "Barbour", Text = "Barbour County" },
                new SelectListItem { Value = "Berkeley", Text = "Berkeley County" },
                new SelectListItem { Value = "Boone", Text = "Boone County" },
                new SelectListItem { Value = "Braxton", Text = "Braxton County" },
                new SelectListItem { Value = "Cabell", Text = "Cabell County" },
                new SelectListItem { Value = "Calhoun", Text = "Calhoun County" },
                new SelectListItem { Value = "Clay", Text = "Clay County" },
                new SelectListItem { Value = "Doddridge", Text = "Doddridge County" },
                new SelectListItem { Value = "Fayette", Text = "Fayette County" },
                new SelectListItem { Value = "Gilmer", Text = "Gilmer County" },
                new SelectListItem { Value = "Grant", Text = "Grant County" },
                new SelectListItem { Value = "Greenbrier", Text = "Greenbrier County" },
                new SelectListItem { Value = "Hampshire", Text = "Hampshire County" },
                new SelectListItem { Value = "Hancock", Text = "Hancock County" },
                new SelectListItem { Value = "Hardy", Text = "Hardy County" },
                new SelectListItem { Value = "Harrison", Text = "Harrison County" },
                new SelectListItem { Value = "Jackson", Text = "Jackson County" },
                new SelectListItem { Value = "Jefferson", Text = "Jefferson County" },
                new SelectListItem { Value = "Kanawha", Text = "Kanawha County" },
                new SelectListItem { Value = "Lewis", Text = "Lewis County" },
                new SelectListItem { Value = "Lincoln", Text = "Lincoln County" },
                new SelectListItem { Value = "Logan", Text = "Logan County" },
                new SelectListItem { Value = "Marion", Text = "Marion County" },
                new SelectListItem { Value = "Marshall", Text = "Marshall County" },
                new SelectListItem { Value = "Mason", Text = "Mason County" },
                new SelectListItem { Value = "McDowell", Text = "McDowell County" },
                new SelectListItem { Value = "Mercer", Text = "Mercer County" },
                new SelectListItem { Value = "Mineral", Text = "Mineral County" },
                new SelectListItem { Value = "Mingo", Text = "Mingo County" },
                new SelectListItem { Value = "Monongalia", Text = "Monongalia County" },
                new SelectListItem { Value = "Monroe", Text = "Monroe County" },
                new SelectListItem { Value = "Morgan", Text = "Morgan County" },
                new SelectListItem { Value = "Nicholas", Text = "Nicholas County" },
                new SelectListItem { Value = "Ohio", Text = "Ohio County" },
                new SelectListItem { Value = "Pendleton", Text = "Pendleton County" },
                new SelectListItem { Value = "Pleasants", Text = "Pleasants County" },
                new SelectListItem { Value = "Pocahontas", Text = "Pocahontas County" },
                new SelectListItem { Value = "Preston", Text = "Preston County" },
                new SelectListItem { Value = "Putnam", Text = "Putnam County" },
                new SelectListItem { Value = "Raleigh", Text = "Raleigh County" },
                new SelectListItem { Value = "Randolph", Text = "Randolph County" },
                new SelectListItem { Value = "Ritchie", Text = "Ritchie County" },
                new SelectListItem { Value = "Roane", Text = "Roane County" },
                new SelectListItem { Value = "Summers", Text = "Summers County" },
                new SelectListItem { Value = "Taylor", Text = "Taylor County" },
                new SelectListItem { Value = "Tucker", Text = "Tucker County" },
                new SelectListItem { Value = "Tyler", Text = "Tyler County" },
                new SelectListItem { Value = "Upshur", Text = "Upshur County" },
                new SelectListItem { Value = "Wayne", Text = "Wayne County" },
                new SelectListItem { Value = "Webster", Text = "Webster County" },
                new SelectListItem { Value = "Wetzel", Text = "Wetzel County" },
                new SelectListItem { Value = "Wirt", Text = "Wirt County" },
                new SelectListItem { Value = "Wood", Text = "Wood County" },
                new SelectListItem { Value = "Wyoming", Text = "Wyoming County" }
            };
            ViewBag.counties = counties;




            System.Diagnostics.Debug.WriteLine("Prepared by: " + typeOne.Prepared_By);
            if (ModelState.IsValid)
            {
                typeOne.Adduser = User.Identity.Name;
                typeOne.Date_Added = DateTime.Today;
                System.Diagnostics.Debug.WriteLine("Prepared by again: " + typeOne.Prepared_By);
                var prep = typeOne.Prepared_By;
                typeOne.Prepared_By = prep;
                _context.Add(typeOne);
                await _context.SaveChangesAsync();
                //Send all History and Archaeology Unit Leaders an email
                List<string> histAndArchLeads = (from s in _context.NR_Users
                                           where s.User_Type == "Unit Leader" && s.Unit == "History" || s.Unit == "Archaeology"
                                           select s.Email_Address).ToList();
                foreach(var email in histAndArchLeads)
                {
                    SendEmail(email);
                }
                //Send an email to Traci if project needs a Mussel or Crayfish habitat assessement (Natural resources Lead)
                if (Assessment != "No" )
                {
                    SendEmail("Cole.k.perry@wv.gov");
                }
                //Send an email to bat lady if project needs a bat habitat assessement
                if (Bat)
                {
                    SendEmail("Cole.k.perry@wv.gov");
                }
                return RedirectToAction(nameof(Index));
            }
            return View(typeOne);
        }

【问题讨论】:

    标签: c# post asp.net-core-mvc asp.net-core-5.0 argumentnullexception


    【解决方案1】:

    您能否检查一下 ASP.NET &lt;form /&gt; 元素?它应该是这样的:

    <form asp-controller="MyController" asp-action="MyAction" method="post">
        <!-- Your controls and etc -->
    </form>
    

    【讨论】:

    • 我的看起来像这样&lt;form asp-action="Create"&gt; &lt;!-- my controls and etc --&gt; &lt;/form&gt;。在应用程序的所有创建页面中都是这样的,而不仅仅是这个。
    • 我添加了您的答案中我缺少的内容,但到目前为止没有任何区别。
    • 能否请您分享整个创建页面以及背后的代码。
    • 我添加了完整的 GET 和 POST 方法,但我无法共享整个“创建”页面,因为它使字符计数过长。
    • 太好了,这就是我以另一种方式提到的:)(使用构造函数加载先决条件数据)
    【解决方案2】:

    首先,在创建页面的 POST 方法中,如果我打印 Prepared_By 的值,它总是会打印正确的名称

    当然它会打印正确的值,因为您将数据成功发布到后端。但是您需要知道下拉填充的数据不是由Prepared_By 存储的。它使用asp-items="@(new SelectList(ViewBag.users))" 存储价值。您没有在 post 方法中设置ViewBag.users,这就是为什么在您回帖时会出现ArgumentNullException 错误。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("ID,State_Project_Number,Federal_Project_Number,Name,Route_Number,County,Work_Type,Coordinates,Project_Description,Federal_Aid,Minimal_Project_Verification,CE_Category,Amms,Activities_Agreement,Arch_RE,Hist_RE,Arch_RE_Date,Hist_RE_Date,Through_Lanes,Close_Road,ROW_Acquisition,Access_Control,Fifty_Year_Structure,Agency_Coordination,IPAC_Screening_Zone,Section_404_Permit,Ground_Disturbance,Waterway,Special_Use_Permit,Floodplain,Prepared_By,Approved_By,Adduser,Date_Added")] TypeOne typeOne, bool Assessment)
    {
        System.Diagnostics.Debug.WriteLine("Prepared by: " + typeOne.Prepared_By);
    
        if (ModelState.IsValid)
        {
            typeOne.Adduser = User.Identity.Name;
            typeOne.Date_Added = DateTime.Today;
    
            System.Diagnostics.Debug.WriteLine("Prepared by again: " + typeOne.Prepared_By);
    
            _context.Add(typeOne);
            await _context.SaveChangesAsync();
        }
        //set the data for ViewBag.users..
        List<string> users = (from c in _context.NR_Users select c.Name).ToList();
        users.Insert(0, "Select");
        ViewBag.users = users;
        //return View("ViewName", typeOne);
        //if you return Create.cshtml,  no need specify the view name
        return View(typeOne);
    }
    

    按照您的第二种方式,请务必调试您的代码并查看它何时运行。如果您在填充下拉列表时未设置 ViewBag.users 的值,则这是不可能的。如果有任何不同,请小心。

    这是一个完整的简单工作演示:

    型号:

    public class Test
    {
        public string Id{ get; set; }
        public string Name { get; set; }
    }
    
    public class TestModel
    {
        public string Prepared_By { get; set; }
    }
    

    查看(创建.cshtml):

    此外,您需要使用public SelectList(IEnumerable items, string dataValueField, string dataTextField);,它将显示正确的值和下拉文本。

    model TestModel
    
    <form method="post">
        <select asp-for="Prepared_By" name="Prepared_By" class="form-control" 
                 asp-items="@(new SelectList(ViewBag.users,"Id","Name"))"></select>
        <input type="submit" value="Post" />
    </form>
    

    控制器:

    [HttpGet]        
    public IActionResult Create()
    {
    
        var data = new List<User>()
        {
            new User(){ Id="1",Name= "aa" },
            new User(){ Id="2",Name= "bb" },
            new User(){ Id="3",Name= "cc" }               
        };
        ViewBag.users = data;
        return View();
    }
    [HttpPost]
    public IActionResult Create(TestModel model)
    {
        ViewBag.users  = new List<Test>()
        {
            new Test(){ MenuCategoryId="1",Content= "aa" },
            new Test(){ MenuCategoryId="2",Content= "bb" },
            new Test(){ MenuCategoryId="3",Content= "cc" }
        };
        return View(model);
    }
    

    【讨论】:

    • 我更新了我的问题以反映您的答案,但到目前为止我还没有取得任何成功。也就是说,我不认为问题是“您没有在您的 post 方法中设置 ViewBag.users,这就是您在回发时出现 ArgumentNullException 错误的原因。”在同一创建页面上的“Prepared_By”之前还有其他下拉框不存在此问题。我也在其他地方的完全相同的地方使用了相同的下拉列表,而没有在 POST 方法中设置它。我非常感谢您的回答,并且您花时间尝试提供帮助。我期待听到您的意见。
    • 我可以分享整个“创建”页面,如果它有助于向您展示我在说什么。
    • 你给出的例子也没有什么意义。根本没有 GET 或 POST 方法。我看不出CreateIndex 与我需要做的事情有什么关系。
    • 好的,我想我给你看样本出错了,我已经改变了。但我想我一开始就向你解释了你的错误是什么。 I also use this same drop down list in the exact same place elsewhere without setting it in the POST method. 再说一次,如果不设置asp-items 的数据,是无法工作的。我认为您需要了解更多关于什么是asp-items。而且您的解决方案也是基于始终设置asp-items 的值。
    • 感谢您的帮助,但我再次相信您错了。它不是impossible,因为我正在这样做并且可以重新创建它,哈哈。
    【解决方案3】:

    我想通了。我将下拉列表抽​​象为第三种方法DropDowns(),然后在 GET 和 POST 方法中调用该方法:

    public void DropDowns()
            {
                List<string> users = (from c in _context.NR_Users select c.Name).ToList();
                users.Insert(0, "Select");
                ViewBag.users = users;
    
                List<string> adminLeads = (from s in _context.NR_Users
                                           where s.User_Type == "Admin" || s.User_Type == "Unit Leader"
                                           select s.Name).ToList();
                adminLeads.Insert(0, "Select");
                ViewBag.adminLeads = adminLeads.ToList();
    
                List<SelectListItem> options = new()
                {
                    new SelectListItem { Value = "True", Text = "Yes" },
                    new SelectListItem { Value = "False", Text = "No" }
                };
                options.Insert(0, new SelectListItem { Value = "Select" });
                ViewBag.options = options;
    
                List<SelectListItem> assessments = new()
                {
                    new SelectListItem { Value = "Mussel", Text = "Mussel" },
                    new SelectListItem { Value = "Crayfish", Text = "Crayfish" },
                    new SelectListItem { Value = "Both", Text = "Both" },
                    new SelectListItem { Value = "No", Text = "No" }
                };
                assessments.Insert(0, new SelectListItem { Value = "Select" });
                ViewBag.assessments = assessments;
    
                List<SelectListItem> reTypes = new()
                {
                    new SelectListItem { Value = "Appendix A short form", Text = "Appendix A short form" },
                    new SelectListItem { Value = "Review exempt", Text = "Review exempt" },
                    new SelectListItem { Value = "SHPO", Text = "SHPO" },
                    new SelectListItem { Value = "Programatic Agreement", Text = "Programatic Agreement" }
                };
                reTypes.Insert(0, new SelectListItem { Value = "Select", Text = "Select" });
                ViewBag.reTypes = reTypes;
    
                List<SelectListItem> counties = new()
                {
                    new SelectListItem { Value = "Barbour", Text = "Barbour County" },
                    new SelectListItem { Value = "Berkeley", Text = "Berkeley County" },
                    new SelectListItem { Value = "Boone", Text = "Boone County" },
                    new SelectListItem { Value = "Braxton", Text = "Braxton County" },
                    new SelectListItem { Value = "Cabell", Text = "Cabell County" },
                    new SelectListItem { Value = "Calhoun", Text = "Calhoun County" },
                    new SelectListItem { Value = "Clay", Text = "Clay County" },
                    new SelectListItem { Value = "Doddridge", Text = "Doddridge County" },
                    new SelectListItem { Value = "Fayette", Text = "Fayette County" },
                    new SelectListItem { Value = "Gilmer", Text = "Gilmer County" },
                    new SelectListItem { Value = "Grant", Text = "Grant County" },
                    new SelectListItem { Value = "Greenbrier", Text = "Greenbrier County" },
                    new SelectListItem { Value = "Hampshire", Text = "Hampshire County" },
                    new SelectListItem { Value = "Hancock", Text = "Hancock County" },
                    new SelectListItem { Value = "Hardy", Text = "Hardy County" },
                    new SelectListItem { Value = "Harrison", Text = "Harrison County" },
                    new SelectListItem { Value = "Jackson", Text = "Jackson County" },
                    new SelectListItem { Value = "Jefferson", Text = "Jefferson County" },
                    new SelectListItem { Value = "Kanawha", Text = "Kanawha County" },
                    new SelectListItem { Value = "Lewis", Text = "Lewis County" },
                    new SelectListItem { Value = "Lincoln", Text = "Lincoln County" },
                    new SelectListItem { Value = "Logan", Text = "Logan County" },
                    new SelectListItem { Value = "Marion", Text = "Marion County" },
                    new SelectListItem { Value = "Marshall", Text = "Marshall County" },
                    new SelectListItem { Value = "Mason", Text = "Mason County" },
                    new SelectListItem { Value = "McDowell", Text = "McDowell County" },
                    new SelectListItem { Value = "Mercer", Text = "Mercer County" },
                    new SelectListItem { Value = "Mineral", Text = "Mineral County" },
                    new SelectListItem { Value = "Mingo", Text = "Mingo County" },
                    new SelectListItem { Value = "Monongalia", Text = "Monongalia County" },
                    new SelectListItem { Value = "Monroe", Text = "Monroe County" },
                    new SelectListItem { Value = "Morgan", Text = "Morgan County" },
                    new SelectListItem { Value = "Nicholas", Text = "Nicholas County" },
                    new SelectListItem { Value = "Ohio", Text = "Ohio County" },
                    new SelectListItem { Value = "Pendleton", Text = "Pendleton County" },
                    new SelectListItem { Value = "Pleasants", Text = "Pleasants County" },
                    new SelectListItem { Value = "Pocahontas", Text = "Pocahontas County" },
                    new SelectListItem { Value = "Preston", Text = "Preston County" },
                    new SelectListItem { Value = "Putnam", Text = "Putnam County" },
                    new SelectListItem { Value = "Raleigh", Text = "Raleigh County" },
                    new SelectListItem { Value = "Randolph", Text = "Randolph County" },
                    new SelectListItem { Value = "Ritchie", Text = "Ritchie County" },
                    new SelectListItem { Value = "Roane", Text = "Roane County" },
                    new SelectListItem { Value = "Summers", Text = "Summers County" },
                    new SelectListItem { Value = "Taylor", Text = "Taylor County" },
                    new SelectListItem { Value = "Tucker", Text = "Tucker County" },
                    new SelectListItem { Value = "Tyler", Text = "Tyler County" },
                    new SelectListItem { Value = "Upshur", Text = "Upshur County" },
                    new SelectListItem { Value = "Wayne", Text = "Wayne County" },
                    new SelectListItem { Value = "Webster", Text = "Webster County" },
                    new SelectListItem { Value = "Wetzel", Text = "Wetzel County" },
                    new SelectListItem { Value = "Wirt", Text = "Wirt County" },
                    new SelectListItem { Value = "Wood", Text = "Wood County" },
                    new SelectListItem { Value = "Wyoming", Text = "Wyoming County" }
                };
                ViewBag.counties = counties;
            }
    

    获取:

    // GET: TypeOnes/Create
            public IActionResult Create()
            {
                DropDowns();
    
                return View();
            }
    

    发布:

     [HttpPost]
            [ValidateAntiForgeryToken]
            public async Task<IActionResult> Create([Bind("ID,State_Project_Number,Federal_Project_Number,Name,Route_Number,County,Work_Type,Coordinates,Project_Description,Federal_Aid,Minimal_Project_Verification,CE_Category,Amms,Activities_Agreement,Arch_RE,Hist_RE,Arch_RE_Date,Hist_RE_Date,Through_Lanes,Close_Road,ROW_Acquisition,Access_Control,Fifty_Year_Structure,Agency_Coordination,IPAC_Screening_Zone,Section_404_Permit,Ground_Disturbance,Waterway,Special_Use_Permit,Floodplain,Prepared_By,Approved_By,Adduser,Date_Added")] TypeOne typeOne, string Assessment, bool Bat)
            {
                DropDowns();
                if (ModelState.IsValid)
                {
                    typeOne.Adduser = User.Identity.Name;
                    typeOne.Date_Added = DateTime.Today;
                    _context.Add(typeOne);
                    await _context.SaveChangesAsync();
                    return RedirectToAction(nameof(Index));
                }
                return View(typeOne);
            }
    

    它开始工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2018-08-22
      相关资源
      最近更新 更多