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

时间:2018-08-13 17:30:02

标签: c# html asp.net-mvc-4 razor

所以我正在研究一个模拟银行业务的项目。我正在尝试设置提款,但无法弄清楚我如何自动将帐户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>

1 个答案:

答案 0 :(得分:0)

您有几个问题。

首先,您没有为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