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