簡體   English   中英

ASP.NET Core MVC 下拉列表將不會重新填充

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

我的項目中有這個下拉列表,當我使用 HttpPost 方法時,我必須重新填充它,否則它會拋出 null 錯誤。 我這樣做了,它像往常一樣工作。 但是,我正在嘗試更改我的數據庫中的記錄,為此,我需要將 Id 放在 URL 中。 我更改了 _Layout 中的代碼,以允許在單擊選項卡時自動輸入用戶 ID。 但是當這種情況發生時,它會拋出“ArgumentNullException:值不能是 null。(參數'項目')。” 即使我重新填充了它。 如果我不添加 ID,它可以工作,但我會更改數據庫上的記錄。 發生了什么事,為什么它不像以前那樣重新填充? 此外,這與賬戶 controller 中的收款人方法有關。

_布局:

@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>

帳戶 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");
            
        }
    }
}

收款人 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; }
    }
}

收款人視圖:

@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");}
}

您只需要在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();
            }


        }

如果沒有if (ModelState.IsValid) ,有時在向數據庫添加數據時會出錯。

如果您的帶有[HttpGet] IActionResult IActionResult 有一個Id作為參數並且您return Viewreturn RedirectToAction那么您需要將值傳遞給返回的 View

例子:

[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