【问题标题】:How do I automatically pass a value to my controller如何自动将值传递给我的控制器
【发布时间】:2018-08-14 01:41:35
【问题描述】:

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


【解决方案1】:

你有几个问题。

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

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

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

Withdraw(int acccountID, decimal balance)

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

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

【讨论】:

  • 首先,谢谢你的回答让我对MVC有了更多的了解,其次,我不是试图改变ID的值,而是平衡的值。在做了一些计算之后。我需要 id 以确保我编辑了正确的帐户余额。
  • @LaHenJ 不客气。在您看来,ID 对应的是什么?如果它不是帐户的 ID,我看不出您认为还有什么应该映射到它。其次,在您看来,您希望将什么作为amount 参数发送到服务器?
  • ID 不参与此视图中的任何内容。它仅供控制器使用。我试图映射的是平衡的变化。我希望输入标签中的值作为金额发送,因为它是用户希望提取的金额。我的思考过程是映射到平衡,因为这是正在改变的,并接受两个参数。正在更改的帐户的 ID 以及您希望该帐户中的余额更改的金额。如果我将我的动作减速更改为[Bind(Include = "balance")]十进制金额'我如何获得id,甚至找到我想要更改的帐户?
  • @LaHenJ 这就是我在上面得到的。您必须有一些 ID 与您正在执行的操作相关,这意味着它必须由您发送到服务器的表单提供,否则无法提供该 ID。在您的场景中,您需要从一个人的银行账户中提取一笔金额,假设他们有足够的资金这样做。这意味着您必须唯一标识该银行帐户,这就是为什么我认为您需要将accountID 以及要提取的金额传递给您的控制器。是否可以提现应在服务器上进行验证。
  • 抱歉回复晚了,但再次感谢。你解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多