Mark Struzinski
Mark Struzinski

Reputation: 33471

FormCollection Empty on Form Post in ASP.NET-MVC

I am posting a very simple form using a method I have used frequently in the past. It may be easier to show my code rather than type a lengthy explanation. Here's the HTML:

<% Html.BeginForm("CreateMarketingType", "ListMaintenance"); %>
    <div id="ListMaintenanceContainer">
        <table>
            <tr>
                <th>Marketing Type Id</th>
                <th>Marketing Type Name</th>
            </tr>                    
                <%foreach (MarketingType marketingType in ViewData.Model.MarketingTypes) %>
                <%{ %>
                    <tr>
                        <td><%= marketingType.MarketingTypeId.ToString() %></td>
                        <td><%= marketingType.MarketingTypeName %></td>
                    </tr>
                <%} %>
        </table>
        <div>
            <fieldset id="fsSaveNewMarketingType">
                <legend>Add New Marketing Type</legend>
                <label for="txtNewMarketingTypeName">New Marketing Type Name:</label>
                <input type="text" id="txtNewMarketingTypeName" />
                <input type="submit" value="Save" id="CreateMarketingType" />
            </fieldset>
        </div>                    
    </div>
<% Html.EndForm();%>

And here's the controller code:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateMarketingType(FormCollection form)
{
    string newMarketingTypeName = Request.Form["txtNewMarketingTypeName"].ToString();

    MarketingType newMarketingType = new MarketingType() { MarketingTypeName = newMarketingTypeName };

    _marketingTypeRepository.AddNewMarketingType(newMarketingType);

    return View("ListMaintenance", GetModel());
}

The submit button posts the form, and the method is invoked, but the form object defined in my parameter is empty. I have also tried Request.Form and I get the same result. Am I missing something here?

Upvotes: 32

Views: 35900

Answers (4)

LCJ
LCJ

Reputation: 22652

I see that this question is already answered. Following is another approach I used in a MVC view, when the form collection was empty. Using JavaScript / jQuery, it sets name-value pairs to a hidden control which gets appended to the form.

JavaScript / jQuery

 $("#btnExport").click(function (event) {
                event.preventDefault();

                //Append the parameter to the form
                var practiceVal = $('#Practice').val();
                $('<input />').attr('type', 'hidden')
                   .attr('name', "Practice").attr('value', practiceVal)
                   .appendTo('#formHome');

                //Submit
                $('#formHome').submit();
            });

Form

 <form id="formHome" method="post">
 </form>

Refer Forms

When a form is submitted for processing, some controls have their name paired with their current value and these pairs are submitted with the form

Upvotes: 0

ben
ben

Reputation: 1458

I had this issue and then realised I had disabled all the INPUT controls before I submitted the form (as a UX feature).

Upvotes: 3

dudeNumber4
dudeNumber4

Reputation: 4697

Wish I could post this as a simple comment, but I don't have that priviledge... I added all my name attributes, and still no joy. Remember to add your name attribute to your form itself. Must use the overload for HTML.BeginForm that accepts htmlAttributes.

Upvotes: 1

Craig Stuntz
Craig Stuntz

Reputation: 126547

None of your inputs have a name attribute. No name = not in the FormCollection.

Upvotes: 93

Related Questions