Link to home
Start Free TrialLog in
Avatar of Niall Gallagher
Niall GallagherFlag for Ireland

asked on

Posting Table Data To Controller

Really need help;
I have a staging table which gets populated  from a SQL stored procedure which allows the user to edit the fields and then when completed  they press a button to send the data back to be saved into multiple tables,
but when I post back to the controller it doesn't have any data.
This is part of the table
<td style="width:100px;">

            @Html.DisplayFor(modelItem => item.Agent_Name)

            @Html.HiddenFor(modelItem => item.Agent_Name, new { @class = "hiddenField" })

        </td>

        <td class="hide">

            @Html.HiddenFor(modelItem => item.Agent__)

        </td>

        <td style="width:30em;">

            @Html.DisplayFor(modelItem => item.Agent_2_Name)

            @Html.HiddenFor(modelItem => item.Merchant_ID, new { @class = "hiddenField" })

        </td>

        <td class="hide">

            @Html.HiddenFor(modelItem => item.Agent_2__)

        </td>

        <td style="width:30em;">

            @Html.DisplayFor(modelItem => item.Agent_3_Name)

            @Html.HiddenFor(modelItem => item.Agent_3_Name, new { @class = "hiddenField" })

        </td>

        <td class="hide">

            @Html.HiddenFor(modelItem => item.Agent_3__)

        </td>

        <td>

            @Html.DisplayFor(modelItem => item.App_Fee)

            @Html.HiddenFor(modelItem => item.App_Fee, new { @class = "hiddenField" })

        </td>

Open in new window


On top of my viewI have
@model My_Report.ViewModels.ConfirmationViewModel

Open in new window


and in the controller I have
 [HttpPost]

        public ActionResult Confirmation(confirmationViewModel records)

        {

             CWACommissionRepository CWA = new CWACommissionRepository();

            foreach (STAGING_TABLE_Details record in records)

            {

                CWA.SaveNewDetails(record);

            }

            return View();

        }

Open in new window


but every time it says records = null

I know I have probably left something very basic out but just can't see it
Avatar of Carl Tawn
Carl Tawn
Flag of United Kingdom of Great Britain and Northern Ireland image

What is it that you are using to populate your view?
Avatar of Niall Gallagher

ASKER

I am populating it from a linq to entity query then populating the view by a viewmodel. I hope that answers your question
How is your ViewModel defined? What you bind to will usually influence how you define the data to be passed back to the controller.
Carl, firstly let me thank you for helping to hopefully get this sorted out.

In my view model I have
public class ConfirmationViewModel
    {
       public List<STAGING_TABLE_Details> getConfirmationData { get; set; }   
    }

Open in new window


It gets populated from
 public ActionResult Confirmation()
        {
            CommissionRepository CWA = new CommissionRepository();
            var vm = new ConfirmationViewModel
            {
                getConfirmationData = CWA.GetStagingTable()
            };               
            return View(vm);

Open in new window


and the query populating it looks like
 public List<STAGING_TABLE_Details> GetStagingTable()
        {
            DateTime lastMonth = DateTime.Today.AddMonths(-1);
            List<STAGING_TABLE_Details> info = null;
            using (CWA_MerchantEntities context = getDataContext())
            {
                info = (from s in context.STAGING_TABLE
                        join a in context._AGENT 
                       on s.Agent_Name equals a.Agent_F_Name + " " + a.Agent_L_Name into ps
                        from a in ps.DefaultIfEmpty() 
                        where s.App_Submit___Date > lastMonth
                        select new STAGING_TABLE_Details
                        {                           
                            Agent_Name = s.Agent_Name,
                            Agent__ = a.Agent_ID.ToString(),
                            Agent_2_Name = s.Agent_2_Name,
                            Agent_2__ = a.Agent_ID.ToString(),
                            Agent_3_Name = s.Agent_3_Name,
                            Agent_3__ = a.Agent_ID.ToString(),                           
                            App_Submit___Date = s.App_Submit___Date
                              }).ToList();
       }
            return info;  
    }                      

Open in new window



Again, Thank you for your help
Are you currently populating your view using a foreach loop by any chance?
Yes,
foreach (var item in Model.getConfirmationData)
ASKER CERTIFIED SOLUTION
Avatar of Carl Tawn
Carl Tawn
Flag of United Kingdom of Great Britain and Northern Ireland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Carl,
Thanks again your answer was correct. Can you help me understand why it made a difference.
This answer saved my hair, after 2 days of staring at the screen.
Thank you.

I am still not 100% sure why it made such a difference but it did.
The clue is in the output produced by the two versions. If you look at the output from the for loop, you will see something like:
<input class="text-box single-line" id="getConfirmationData_0__Agent__" name="getConfirmationData[0].Agent__" type="text" value="Agent1" />

Open in new window

Whereas the version with a foreach loop will generate something like:
<input class="text-box single-line" id="item_Agent__" name="item.Agent__" type="text" value="Agent1" />

Open in new window

Notice that there is no numeric indexing in the foreach version.

When the data is posted to the server it is sent in the Form object, the controller has no idea that it was in a HTML table. So, without the index numbers in the IDs the server has no way to figure out that it is being sent a collection of items rather than just a single item.
OH OK,

Thanks for the answer AND the explanation