Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MVC 4 ViewModel not being sent back to Controller

I can't seem to figure out how to send back the entire ViewModel to the controller to the 'Validate and Save' function.

Here is my controller:

[HttpPost] public ActionResult Send(BitcoinTransactionViewModel transaction) { } 

Here is the form in the 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" }) } 

When i click on submit, the conroller contains the correct value of the walletAddress field but transaction.Transaction.Time, transaction.Transaction.Location, transaction.Transaction.TransactionId are empty.

Is there a way i could pass the entire Model back to the controller?

Edit:

When i dont even receive the walletAddress in the controller. Everything gets nulled! When i remove this line alone: @Html.HiddenFor(m => m.Transaction.TransactionId); it works and i get the Token property on the controller, but when i add it back, all the properties of the transaction object on the controller are NULL.

Here is the 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; }     } 

Any ideas?

EDIT: I figured it out, its in the marked answer below...

like image 679
Uri Abramson Avatar asked Aug 18 '13 13:08

Uri Abramson


1 Answers

OK, I've been working on something else and bumpend into the same issue all over again. Only this time I figured out how to make it work!

Here's the answer for anyone who might be interested:

Apparently, there is a naming convention. Pay attention:

This doesn't work:

// 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); . . 

This works:

// 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); . . 

In other words - a naming convention error! There was a naming ambiguity between the Model.Transaction property and my transaction form field + controller parameter. Unvelievable.

If you're experiencing the same problems make sure that your controller parameter name is unique - try renaming it to MyTestParameter or something like this...

In addition, if you want to send form values to the controller, you'll need to include them as hidden fields, and you're good to go.

like image 165
Uri Abramson Avatar answered Oct 04 '22 05:10

Uri Abramson