using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using BankingFramework.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
namespace BankingFramework.Pages
{
public class TransferSToCModel : PageModel
{
private readonly BankingFramework.Models.MyBankContext _context;
private readonly IHttpContextAccessor _httpContextAccessor;
public TransferSToCModel(BankingFramework.Models.MyBankContext context, IHttpContextAccessor httpContextAccessor)
{
_context = context;
_httpContextAccessor = httpContextAccessor;
}
public string Message { get; set; }
//[BindProperty]
//public decimal SavingBalance { get; set; }
//[BindProperty]
//public decimal CheckingBalance { get; set; }
//[BindProperty]
//[Range(0, 100000, ErrorMessage = "invalid amount specified")]
//public decimal Amount { get; set; }
[BindProperty]
public TransferSToC TransferSToC { get; set; }
[BindProperty]
public SavingAccounts SavingAccounts { get; set; }
[BindProperty]
public CheckingAccounts CheckingAccounts { get; set; }
[BindProperty]
public decimal Amount { get; set; }
public IActionResult OnGet()
{
SavingAccounts = new SavingAccounts();
CheckingAccounts = new CheckingAccounts();
var userName = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.Name).Value;
SavingAccounts = _context.SavingAccounts.FirstOrDefault(t => t.Username == userName);
CheckingAccounts = _context.CheckingAccounts.FirstOrDefault(t => t.Username == userName);
//SavingAccounts.Balance = SavingObj.Balance;
//CheckingAccounts.Balance = CheckingObj.Balance;
Amount = 0;
Message = "any is " + Amount;
return Page();
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
SavingAccounts.Balance = SavingAccounts.Balance - Amount;
CheckingAccounts.Balance = CheckingAccounts.Balance + Amount;
_context.Attach(SavingAccounts).State = EntityState.Modified;
_context.Attach(CheckingAccounts).State = EntityState.Modified;
await _context.SaveChangesAsync();
return RedirectToPage("./TransferSToC");
}
}
}
上面的代码是我的OnGet和OnPost方法。在这里,我想做的是,在网站上,您可以看到支票帐户和储蓄帐户中有多少余额。因此,我想根据用户在网站上输入的金额将钱从储蓄帐户转移到支票帐户。转帐后,应扣除储蓄账户中的余额。并且应增加支票帐户中的余额。如何在数据库和网站上更改值?以下代码显示了设计页面。
@page
@model BankingFramework.Pages.TransferSToCModel
@{
ViewData["Title"] = "TransferSToC";
}
<h2>TransferSToC</h2>
<div class="row">
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="SavingAccounts.Balance" class="control-label"></label>
<input asp-for="SavingAccounts.Balance" class="form-control" />
<span asp-validation-for="SavingAccounts.Balance" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="CheckingAccounts.Balance" class="control-label"></label>
<input asp-for="CheckingAccounts.Balance" class="form-control" />
<span asp-validation-for="CheckingAccounts.Balance" 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="Transfer" class="btn btn-default" />
</div>
</form>
</div>
</div>
<div>
<a asp-page="./Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
我遇到以下错误:DbUpdateConcurrencyException: Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions.
Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ThrowAggregateUpdateConcurrencyException(int commandIndex, int expectedRowsAffected, int rowsAffected)