简体   繁体   English

ASP.NET Core MVC 下拉列表将不会重新填充

[英]ASP.NET Core MVC drop down list will not repopulate

I have this drop-down list in my project, and when I use the HttpPost method I have to repopulate it or it's going to throw a null error.我的项目中有这个下拉列表,当我使用 HttpPost 方法时,我必须重新填充它,否则它会抛出 null 错误。 I did that, and it worked like normal.我这样做了,它像往常一样工作。 However, I'm trying to change a record on my database, and in order to do that, I need the Id to be in the URL.但是,我正在尝试更改我的数据库中的记录,为此,我需要将 Id 放在 URL 中。 I changed my code in the _Layout to allow the user Id to be automatically entered when they click the tab.我更改了 _Layout 中的代码,以允许在单击选项卡时自动输入用户 ID。 But when that happens it throws "ArgumentNullException: Value cannot be null. (Parameter 'items')."但是当这种情况发生时,它会抛出“ArgumentNullException:值不能是 null。(参数'项目')。” Even though I repopulated it.即使我重新填充了它。 If I don't add the Id, it works, but I change the record on the database.如果我不添加 ID,它可以工作,但我会更改数据库上的记录。 What's going on, why is it not repopulating like before?发生了什么事,为什么它不像以前那样重新填充? Also, this is pertaining to the Payee method in the Account controller.此外,这与账户 controller 中的收款人方法有关。

_Layout: _布局:

@using Microsoft.AspNetCore.Identity
@using The_Bank_of_Cardinal.Areas.Identity.Data

@inject SignInManager<CardinalUser> SignInManager
@inject UserManager<CardinalUser> UserManager

<style>
    #menu ul li {
        /*float: left;
        border: 1px;
        border-style: solid;*/
    }
    #menu ul li a:hover{
        background-color: lightgray;
    }
    #menu ul ul {
        display: none;
        height: auto;
        padding: 0px;
        margin: 0px;
        border: 1px;
        position: absolute;
        border-style: solid;
        background-color: white;
        z-index : 5000;
    }
    #menu ul li:hover > ul{

        display: block;
    }
</style>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - The Bank of Cardinal</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                @if (SignInManager.IsSignedIn(User))
                    {
                        <a class="navbar-brand" asp-area="" asp-controller="Account" asp-action="Index">The Bank of Cardinal</a>
                    }else
                        { 
                            <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">The Bank of Cardinal</a>
                        }
        
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div id="menu" class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial.cshtml" />
                    <ul class="navbar-nav flex-grow-1">
                        @if (SignInManager.IsSignedIn(User))
                        {
                            <li class="nav-item"><a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Index">User Account</a></li>
                            <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Transactions">Transaction History</a></li>
                            <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Deposit" asp-route-id="@UserManager.GetUserAsync(User).Result.Id">Deposit</a></li>
                            <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Transfers">Transfers</a>
                                                  <ul>
                                                      <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Payee" asp-route-id="@UserManager.GetUserAsync(User).Result.Id">User Pay</a>
                                                      
                                                      <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="BillPay" asp-route-id="@UserManager.GetUserAsync(User).Result.Id">Bill Pay </a>
                                                      
                                                      <li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="AddPayee">Create Payee</a>
                                                  </ul>
                            </li>
                        }
                        else
                        {

                            <li class="nav-item">
                                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
                            </li>
                            <li class="nav-item">
                                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Transactions">Transactions</a>
                            </li>
                            @*<li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Test">Test</a>
            </li>*@
                            @*<li class="nav-item">
                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Data">User Data</a>
            </li>*@
                            <li class="nav-item">
                                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Info">User Info</a>
                            </li>
                            <li class="nav-item">
                                <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
                            </li>
                        }

                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - The_Bank_of_Cardinal - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
        </div>
    </footer>
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>
    @RenderSection("Scripts", required: false)
</body>
</html>

Account controller:帐户 controller:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using The_Bank_of_Cardinal.Areas.Identity.Data;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using The_Bank_of_Cardinal.Models;






namespace The_Bank_of_Cardinal.Controllers
{
   
       
   
    
    [Authorize]
    public class AccountController : Controller
    {
        private readonly TransactionConnection _tc;
        private readonly UserManager<CardinalUser> userManager;
        private readonly SignInManager<CardinalUser> signInManager;
        private readonly DepositConnection _dc;
        private readonly PayeeConnection _pc;
        public AccountController(TransactionConnection tc, UserManager<CardinalUser> userManager, SignInManager<CardinalUser> signInManager, DepositConnection dc, PayeeConnection pc)
        {
            _tc = tc;
            this.userManager = userManager;
            this.signInManager = signInManager;
            _dc = dc;
            _pc = pc;
        }
        public IActionResult Index()
        {
            return View();
        }
        public IActionResult Transactions()
        {
            var results = _tc.TransactionHistory.Where(o=> o.UserName == userManager.GetUserAsync(User).Result.UserName).ToList();
            return View(results);
        }

        public IActionResult Test() 
        {
            return View();
        }
        [HttpGet]
        public IActionResult Deposit(string Id)
        {
            var resultss = _dc.AspNetUsers.Where(s => s.Id == Id).FirstOrDefault();
            
            return View(resultss);
        }
        [HttpPost]
        public IActionResult Deposit(DepositModel model, TransactionModel tm)
        {
            
            var resultss = _dc.AspNetUsers.Where(s => s.Id == model.Id).FirstOrDefault();
            double test = model.AccountBalance + userManager.GetUserAsync(User).Result.AccountBalance;


            tm.UserName = userManager.GetUserAsync(User).Result.UserName;
            string name = tm.UserName;
            tm.Description = "personal deposit";
            tm.TransactionType = "Deposit";
            tm.Amount = "$" + model.AccountBalance.ToString();
            tm.Date = DateTime.Now;

            model.AccountBalance = test;

            _tc.TransactionHistory.Add(tm);
            _tc.SaveChanges();


            _dc.AspNetUsers.Remove(resultss);
            _dc.AspNetUsers.Add(model);
            _dc.SaveChanges();


            //_dc.AspNetUsers.


            return Content("This is your info \n" + 
                $"Name: {name} \n" + 
                $"Description: {tm.Description} \n" + 
                $"type: {tm.TransactionType} \n" + 
                $"Amount {tm.Amount} \n");
        }
        public IActionResult Transfers()
        {
            return View();
        }
        [HttpGet]
        public IActionResult AddPayee() {


            return View();
        
        }
        [HttpPost]
        public IActionResult AddPayee(PayeeModel pm)
        {
            if (ModelState.IsValid)
            {
                pm.UserName = userManager.GetUserAsync(User).Result.UserName;
                _pc.Payee.Add(pm);
                _pc.SaveChanges();

                return RedirectToAction("Transfers");
            }

            return View();
        }
        [HttpGet]
        public IActionResult Payee(string Id)
        {

            var resultss = _dc.AspNetUsers.Where(s => s.Id == Id).FirstOrDefault();
            
            List<PayeeModel> li = new List<PayeeModel>();
            
            li = _pc.Payee.Where(s => s.UserName == userManager.GetUserAsync(User).Result.UserName).ToList();
            
            ViewBag.payeeNames = li;


            return View();
        }
        [HttpPost]
        public IActionResult Payee(PayPayee pp, TransactionModel tm, DepositModel model)
        {
            if (ModelState.IsValid)
            {
                

                var resultss = _dc.AspNetUsers.Where(s => s.Id == model.Id).FirstOrDefault();
                tm.Description = "You Transfered money to the user named " + pp.Name;
                tm.Amount = pp.Amount.ToString();
                tm.TransactionType = "User Pay";
                tm.Date = DateTime.Now;
                tm.UserName = userManager.GetUserAsync(User).Result.UserName;
                model.AccountBalance = userManager.GetUserAsync(User).Result.AccountBalance - pp.Amount;

                

                _tc.TransactionHistory.Add(tm);
                _tc.SaveChanges();
                _dc.AspNetUsers.Remove(resultss);
                _dc.AspNetUsers.Add(model);
                _dc.SaveChanges();


                List<PayeeModel> li = new List<PayeeModel>();
                li = _pc.Payee.Where(s => s.UserName == userManager.GetUserAsync(User).Result.UserName).ToList();
                ViewBag.payeeNames = li;


                return View("Transfers");
                
            }
            else
            {
                return View();
            }


        }

        [HttpGet]
        public IActionResult BillPay(string Id)
        {
            var resultss = _dc.AspNetUsers.Where(s => s.Id == Id).FirstOrDefault();
            return View();
        }
        [HttpPost]
        public IActionResult BillPay(BillPayModel bp, TransactionModel tm, DepositModel model)
        {
           
                var resultss = _dc.AspNetUsers.Where(s => s.Id == model.Id).FirstOrDefault();
                tm.Amount = "$" + bp.Amount.ToString();
                tm.UserName = userManager.GetUserAsync(User).Result.UserName;
                tm.Description = "you sent " + bp.Company + " a payment \n with the account number " + bp.AccountNumber;
                tm.TransactionType = "Bill pay";
                tm.Date = DateTime.Now;
                model.AccountBalance = userManager.GetUserAsync(User).Result.AccountBalance - bp.Amount;

                _tc.TransactionHistory.Add(tm);
                _tc.SaveChanges();
                _dc.AspNetUsers.Remove(resultss);
                _dc.AspNetUsers.Add(model);
                _dc.SaveChanges();

                return RedirectToAction("Transfers");
            
        }
    }
}

PayPayee model:收款人 model:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace The_Bank_of_Cardinal.Models
{
    public class PayPayee
    {
        public string Name { get; set; }
        public double Amount { get; set; }
    }
}

Payee view:收款人视图:

@model The_Bank_of_Cardinal.Models.PayPayee

@{
    ViewData["Title"] = "Payee";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h1>Payee</h1>

<h4>PayeeModel</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Payee">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>

            <div class="form-group">
                <label asp-for="Name" class="control-label"></label>
                <select asp-for="Name" asp-items="@(new SelectList(@ViewBag.payeeNames, "Payee", "Payee"))"></select>
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label  asp-for="Amount" class="control-label"></label>
                <input  asp-for="Amount" class="form-control" />
                <span asp-validation-for="Amount" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

You only need to set ViewBag outside if (ModelState.IsValid) :您只需要在if (ModelState.IsValid)之外设置 ViewBag :

[HttpPost]
        public IActionResult Payee(PayPayee pp, TransactionModel tm, DepositModel model)
        {
            List<PayeeModel> li = new List<PayeeModel>();
                li = _pc.Payee.Where(s => s.UserName == userManager.GetUserAsync(User).Result.UserName).ToList();
                ViewBag.payeeNames = li;
            if (ModelState.IsValid)
            {
                

                var resultss = _dc.AspNetUsers.Where(s => s.Id == model.Id).FirstOrDefault();
                tm.Description = "You Transfered money to the user named " + pp.Name;
                tm.Amount = pp.Amount.ToString();
                tm.TransactionType = "User Pay";
                tm.Date = DateTime.Now;
                tm.UserName = userManager.GetUserAsync(User).Result.UserName;
                model.AccountBalance = userManager.GetUserAsync(User).Result.AccountBalance - pp.Amount;

                

                _tc.TransactionHistory.Add(tm);
                _tc.SaveChanges();
                _dc.AspNetUsers.Remove(resultss);
                _dc.AspNetUsers.Add(model);
                _dc.SaveChanges();


                


                return View("Transfers");
                
            }
            else
            {
                return View();
            }


        }

Without if (ModelState.IsValid) ,sometimes it will get error when you add data to database.如果没有if (ModelState.IsValid) ,有时在向数据库添加数据时会出错。

If your IActionResult with [HttpGet] has a Id as Parameter and you return View or return RedirectToAction then you need to pass the value, to the returned View如果您的带有[HttpGet] IActionResult IActionResult 有一个Id作为参数并且您return Viewreturn RedirectToAction那么您需要将值传递给返回的 View

Example:例子:

[HttpGet]
public IActionResult Test(string id)
{
   //Some code here
   return View();
}
[HttpPost]
public IActionResult Test(Bind["Id,FirstName,LastName"] Person model)
{
   //some code here
   return RedirectToAction(nameof(Test), (new {model.Id}));
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM