首页 > 解决方案 > 如何自动将值传递给我的控制器

问题描述

所以我正在做一个模拟银行业务的项目。我正在尝试设置提款,但不知道如何将帐户 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>

标签: c#htmlasp.net-mvc-4razor

解决方案


你有几个问题。

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

其次,您在操作中使用[Bind(Include = "balance")]id参数Withdraw。这将阻止您将正确的值绑定到id.

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

Withdraw(int acccountID, decimal balance)

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

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


推荐阅读