如何自动将值传递给我的控制器

How do I automatically pass a value to my controller

所以我正在做一个模拟银行业务的项目。我正在尝试设置提款,但无法弄清楚如何自动将帐户 ID 与要提款的金额一起传递给控制器​​。我一直收到一个错误,它说金额的条目为空,这意味着他们将金额作为 id 变量。

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Withdraw([Bind(Include = "balance")] int id, decimal amount)
{

if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        bankAccount bankAccount = db.Accounts.Find(id);
        if (bankAccount == null)
        {
            return HttpNotFound();
        }

        if (bankAccount.type)
        {
            bankAccount.withdraw(amount);
        }
        else
        {
            if (amount > bankAccount.balance)
            {
                ModelState.AddModelError("Amount", "Checking accounts can't be overdraft.");
                return View(bankAccount);
            }
            else
            {
                bankAccount.withdraw(amount);
            }
        }

        if (ModelState.IsValid)
        {
            db.Entry(bankAccount).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Details", new { id = bankAccount.customerID });
        }
        return View(bankAccount);
    }

查看

@model BankProject.bankAccount

@{
ViewBag.Title = "Withdraw";

}

<h2>Withdraw</h2>
@using (Html.BeginForm("Withdraw", "bankAccounts", FormMethod.Post))
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>bankAccount</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.accountID)


    <div class="form-group">
        Remaining Balance: @Html.DisplayFor(model => model.balance) <br />
            Withdraw amount: <input type="number" name="out" id="moneyW" />
            <br />

            <input type="submit" value="Withdraw" />

    </div>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>

你有几个问题。

首先,您没有为 balance 提供隐藏字段。所有发送到服务器的数据都必须有一个关联的 input 元素,可以由浏览器发回。 Html.DisplayFor() 不呈现 input 元素。 Html.EditorFor() 可以,但如果您不希望用户编辑 UI 中的值,则不合适。在这种情况下,您必须提供一个隐藏字段。

其次,您在 Withdraw 操作中针对 id 参数使用了 [Bind(Include = "balance")]。这将阻止您获得绑定到 id.

的正确值

最后,@Html.HiddenFor(model => model.accountID) 呈现名称为 accountID 的输入元素。为了在您的操作中将值正确绑定在一起,它们必须具有相同的名称(或具有用于绑定复杂模型的正确前缀)。在您的情况下,这意味着将您的操作签名更改为:

Withdraw(int acccountID, decimal balance)

这样做并在您的视图中添加 @Html.HiddenFor(model => model.balance) 应该可以解决您的问题。

此时,如果这对您有效,请尝试将操作中的参数更改为 [Bind(Include = "balance")] decimal amount,这样您就可以获得所需的参数名称 amount