我似乎无法弄清楚如何将整个 ViewModel 发送回 Controller 以执行“验证并保存”功能。
这是我的 Controller :
[HttpPost]
public ActionResult Send(BitcoinTransactionViewModel transaction)
{
}
这是 View 中的表单:
<li class="check">
<h3>Transaction Id</h3>
<p>@Html.DisplayFor(m => m.Transaction.TransactionId)</p>
</li>
<li class="money">
<h3>Deposited Amount</h3>
<p>@Model.Transaction.Amount.ToString() BTC</p>
</li>
<li class="time">
<h3>Time</h3>
<p>@Model.Transaction.Time.ToString()</p>
</li>
@using (Html.BeginForm("Send", "DepositDetails", FormMethod.Post, new { transaction = Model }))
{
@Html.HiddenFor(m => m.Token);
@Html.HiddenFor(m => m.Transaction.TransactionId);
@Html.TextBoxFor(m => m.WalletAddress, new { placeholder = "Wallet Address", maxlength = "34" })
<input type="submit" value="Send" />
@Html.ValidationMessage("walletAddress", new { @class = "validation" })
}
当我点击提交时,conroller 包含 walletAddress 字段的正确值但是 transaction.Transaction.Time
, transaction.Transaction.Location
, transaction .Transaction.TransactionId
为空。
有没有办法将整个模型传回 Controller ?
编辑:
当我什至没有在 Controller 中收到 walletAddress
时。一切都归零!
当我单独删除这一行时:@Html.HiddenFor(m => m.Transaction.TransactionId);
它工作正常,我在 Controller 上获得了 Token 属性,但是当我将它添加回去时, Controller 上 transaction
对象的所有属性都是 NULL。
这是 BitcoinTransactionViewModel:
public class BitcoinTransactionViewModel
{
public string Token { get; set; }
public string WalletAddress { get; set; }
public BitcoinTransaction Transaction { get; set; }
}
public class BitcoinTransaction
{
public int Id { get; set; }
public BitcoinTransactionStatusTypes Status { get; set; }
public int TransactionId { get; set; }
public decimal Amount { get; set; }
public DateTime Time { get; set; }
public string Location { get; set; }
}
有什么想法吗?
编辑:我想通了,它在下面标记的答案中......
最佳答案
好吧,我一直在做其他事情并且再次遇到同样的问题。 只有这一次我想出了如何让它发挥作用!
以下是所有可能感兴趣的人的答案:
显然,有一个命名约定。注意:
这行不通:
// Controller
[HttpPost]
public ActionResult Send(BitcoinTransactionViewModel transaction)
{
}
// View
@using (Html.BeginForm("Send", "DepositDetails", FormMethod.Post, new { transaction = Model }))
{
@Html.HiddenFor(m => m.Token);
@Html.HiddenFor(m => m.Transaction.TransactionId);
.
.
这个有效:
// Controller
[HttpPost]
public ActionResult Send(BitcoinTransactionViewModel **RedeemTransaction**)
{
}
// View
@using (Html.BeginForm("Send", "DepositDetails", FormMethod.Post, new { **RedeemTransaction** = Model }))
{
@Html.HiddenFor(m => m.Token);
@Html.HiddenFor(m => m.Transaction.TransactionId);
.
.
换句话说——命名约定错误! Model.Transaction
属性和我的 transaction
表单字段 + Controller 参数之间存在命名歧义。难以置信。
如果您遇到同样的问题,请确保您的 Controller 参数名称是唯一的 - 尝试将其重命名为 MyTestParameter 或类似的名称...
此外,如果您想将表单值发送到 Controller ,则需要将它们作为隐藏字段包含在内,这样就可以了。
关于c# - MVC 4 ViewModel 没有被发送回 Controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299669/