简体   繁体   中英

asp.net core mvc table keeps showing same number

I am at a total lost. Everything seems correct. and when I look at the database the correct number is being submitted. But when I go to list the data from the database, the Amount column in the database list the same number. When you go to the deposit tab, the first number you put in is always the number that will be displayed. So if i enter $50, $50 will appear in the transaction tab. However, let's say if i go back and put $60. It will still say $50 in the transaction history tab, but in the database, it says $60. Why is it not displaying the number from the database?

Account 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;
        public AccountController(TransactionConnection tc, UserManager<CardinalUser> userManager, SignInManager<CardinalUser> signInManager, DepositConnection dc)
        {
            _tc = tc;
            this.userManager = userManager;
            this.signInManager = signInManager;
            _dc = dc;
        }
        public IActionResult Index()
        {
            return View();
        }
        public IActionResult Transactions()
        {
            var results = _tc.TransactionHistory.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();
            int 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();

            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();
        }
        
    }
}

Transaction view:

@model IEnumerable<The_Bank_of_Cardinal.Models.TransactionModel>

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

<h1>Transactions</h1>

<p>
    <a asp-action="Create">Create New</a>
</p>
@*<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.UserName)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Description)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TransactionType)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Amount)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Date)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.UserName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Description)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.TransactionType)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Amount)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Date)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
                @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
                @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
            </td>
        </tr>
}
    </tbody>
</table>*@

<div class="container">
    @if (Model != null)
    {
        <table class="table table-dark">
            <thead>
                <tr>
                    <th scope="col">Name</th>
                    <th scope="col">Description</th>
                    <th scope="col">Transaction Type</th>
                    <th scope="col">Amount</th>
                    <th scope="col">Date</th>
                </tr>
            </thead>
            <tbody>
                @foreach (var item in Model)
                {
                <tr>
                    <td>@Html.DisplayFor(modelItem => item.UserName)</td>
                    <td>@Html.DisplayFor(modelItem => item.Description)</td>
                    <td>@Html.DisplayFor(modelItem => item.TransactionType)</td>
                    <td>@Html.DisplayFor(modelItem => item.Amount)</td>
                    <td>@Html.DisplayFor(modelItem => item.Date)</td>
                </tr>
                }
            </tbody>
        </table>
    }
</div>

Deposit view:

@model The_Bank_of_Cardinal.Models.DepositModel

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

<h1>Deposit</h1>

<h4>DepositModel</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Deposit">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label hidden asp-for="Id" class="control-label"></label>
                <input hidden asp-for="Id" class="form-control" />
                <span asp-validation-for="Id" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="AccountBalance" class="control-label">Amount</label>
                <input asp-for="AccountBalance" class="form-control" value="0" />
                <span asp-validation-for="AccountBalance" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Deposit" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

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

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

deposit model:

using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using The_Bank_of_Cardinal.Areas.Identity.Data;

namespace The_Bank_of_Cardinal.Models
{
    public class DepositModel
    {
        [Key]
        public string Id { get; set; }
        public int AccountBalance { get; set; }
        

    }
}

Transaction model:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace The_Bank_of_Cardinal.Models
{
    public class TransactionModel
    {
        [Key]
        public string UserName { get; set; }
        public string Description { get; set; }
        public string TransactionType { get; set; }
        public string Amount { get; set; }
        public DateTime Date { get; set; }

    }
}

deposit DbContext:

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

namespace The_Bank_of_Cardinal.Models
{
    public class DepositConnection : DbContext
    {
        public DepositConnection(DbContextOptions<DepositConnection> options) : base(options)

        {

        }

        public DbSet<DepositModel> AspNetUsers { get; set; }

    }
}

Transaction DbContext:

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

namespace The_Bank_of_Cardinal.Models
{
    public class TransactionConnection : DbContext
    {
        public TransactionConnection(DbContextOptions<TransactionConnection> options) : base(options)
        {

        }
        public DbSet<TransactionModel> TransactionHistory { get; set; }
    }
}

这是保存有正确数据的数据库

这是具有相同编号的交易选项卡

  • You're using @Html.XXXFor() incorrectly.
  • When you want to use HTML-helpers for HTML <form> input binding from a collection in your ViewModel you need to use for() , not foreach() and you need to the [int index] indexer in the For() expression.
  • When you need to bind a form object / form model and pass extra data to your view, use ViewData for the one-way data and Model for the two-way data.
    • I think that ASP.NET MVC and ASP.NET Core's view-model and form-binding system needs a re-think, as it's just plain wrong to require the ViewModel object to also be the bound form model . In my own projects I have my own extensions over ASP.NET Core to allow me to use separate types/objects cleanly.
  • I can't fix your ActionLink items though
    <tbody>
@for( int i = 0; i < this.Model.Count; i++ ) {
    
        <tr>
            <td>
                @Html.DisplayFor( m => m[i].UserName )
            </td>
            <td>
                @Html.DisplayFor( m => m[i].Description )
            </td>
            <td>
                @Html.DisplayFor( m => m[i].TransactionType )
            </td>
            <td>
                @Html.DisplayFor( m => m[i].Amount )
            </td>
            <td>
                @Html.DisplayFor( m => m[i].Date )
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
                @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
                @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
            </td>
        </tr>
}
    </tbody>

The class TransactionModel has for primary key the property UserName . But you have several TransactionModel instances with the same UserName value. This is contradictory. Each TransactionModel primary key must be unique.

Change your TransactionModel class to something like:

public class TransactionModel
{
    public int Id { get; set; } // This is the primary key.
    public string UserName { get; set; }
    public string Description { get; set; }
    public string TransactionType { get; set; }
    public decimal Amount { get; set; }
    public DateTime Date { get; set; }
}

The property Id is your primary key. It will be automatically incremented. This is by convention. See: https://docs.microsoft.com/en-us/ef/core/modeling/keys?tabs=data-annotations#configuring-a-primary-key

and https://docs.microsoft.com/en-us/ef/core/modeling/generated-properties?tabs=data-annotations#primary-keys

Side note: The type of the property Amount should rather be decimal than string, so this is changed in the example above. In the same spirit, an enum would maybe be a better choice for the TransactionType property.

You will need of course to modify the code using the class TransactionModel in order to take into account its new definition.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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