c# - MVC 4 ViewModel 没有被发送回 Controller

标签 c# asp.net-mvc asp.net-mvc-4

我似乎无法弄清楚如何将整个 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/

相关文章:

asp.net-mvc - 在多个 MVC 应用程序中重用一个 MVC 区域?

asp.net-mvc - ASP MVC3在actionlink内插入html标记

javascript - 不更新 javascript 文件

c# - 如何在自定义类构造函数中注入(inject)单例并使用它 | .NET 核心 2

C# - 干净地关闭 OpenVPN

c# - 使用 Azure 的 Asp mvc 用户登录

asp.net-mvc - ASP.NET MVC4 + Bootstrap 3 如何应用不同的主题?

c# - ASP.net MVC 4 - CaSTLe Windsor - 找不到方法 : 'System. Web.Http.Services.DependencyResolver

c# - NLog如何写消息源

c# - 为什么我不能修改拆箱转换的结果?