了解しました。
ご質問の内容は、ASP.NET Core MVC の Payments/Index アクションで使っている
int runningTotal = 0;
foreach (var t in paymentBalance)
{
runningTotal += t.Amount;
t.Balance = runningTotal;
}
の runningTotal の初期値をユーザー入力にする + 初期値を入力したら Ajax で即時反映する という要件ですね。
以下に、サーバー側(Controller)+ビュー(Razor)+Ajax の構成例を示します。
1. モデル例
public class Payment
{
public int Id { get; set; }
public int Amount { get; set; }
public int Balance { get; set; }
}
2. コントローラー例
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Linq;
public class PaymentsController : Controller
{
// ダミーデータ
private static readonly List<Payment> _payments = new()
{
new Payment { Id = 1, Amount = 100 },
new Payment { Id = 2, Amount = 200 },
new Payment { Id = 3, Amount = 300 }
};
// 初期表示
public IActionResult Index()
{
return View(_payments);
}
// Ajaxで初期値を受け取り、計算結果を返す
[HttpPost]
public IActionResult CalculateBalances([FromBody] int initialValue)
{
int runningTotal = initialValue;
var updated = _payments
.Select(p => new Payment
{
Id = p.Id,
Amount = p.Amount,
Balance = (runningTotal += p.Amount)
})
.ToList();
return Json(updated);
}
}
3. ビュー(Index.cshtml)
@model List<Payment>
@{
ViewData["Title"] = "Payments";
}
<h2>Payments</h2>
<label>初期値: </label>
<input type="number" id="initialValue" value="0" />
<button id="calcBtn">計算</button>
<table id="paymentsTable" border="1">
<thead>
<tr>
<th>ID</th>
<th>Amount</th>
<th>Balance</th>
</tr>
</thead>
<tbody>
@foreach (var p in Model)
{
<tr>
<td>@p.Id</td>
<td>@p.Amount</td>
<td>@p.Balance</td>
</tr>
}
</tbody>
</table>
@section Scripts {
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$("#calcBtn").on("click", function () {
var initialValue = parseInt($("#initialValue").val()) || 0;
$.ajax({
url: '@Url.Action("CalculateBalances", "Payments")',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(initialValue),
success: function (data) {
var tbody = $("#paymentsTable tbody");
tbody.empty();
data.forEach(function (p) {
tbody.append(
"<tr><td>" + p.id + "</td><td>" + p.amount + "</td><td>" + p.balance + "</td></tr>"
);
});
},
error: function () {
alert("計算に失敗しました。");
}
});
});
</script>
}
4. 動作の流れ
- ページ表示時は
Index アクションで初期データを表示。 - ユーザーが「初期値」を入力して [計算] ボタンを押す。
- JavaScript(jQuery Ajax)が
CalculateBalances に初期値を送信。 - サーバー側で
runningTotal をその初期値から計算し直し、JSON で返す。 - クライアント側でテーブルを即時更新。
5. 即時反映(ボタン不要)にする場合
#calcBtn のクリックイベントではなく、#initialValue の input イベントで Ajax を呼び出せば、入力するたびに即時反映されます。
$("#initialValue").on("input", function () {
var initialValue = parseInt($(this).val()) || 0;
// 上記と同じAjax処理をここに
});
✅ この方法なら、runningTotal の初期値をユーザーが自由に入力でき、Ajax で即時に計算結果を反映できます。
もし希望があれば、このコードを ボタンなしリアルタイム更新版 に完全書き換えたバージョンも作れます。
作りますか?
リアルタイム更新版にすれば、入力するたびにテーブルが自動更新されます。
Powered by Froala Editor