在剃须刀页面中,如何更改值?(OnGet和OnPost之间的关系)

时间:2018-12-11 23:05:52

标签: c# asp.net-mvc entity-framework razor-pages

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)

0 个答案:

没有答案