views:

3741

answers:

2

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?

+19  A: 

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

Craig Stuntz
Ouch - that's what I get for growing up on WebForms!! I thought the id attribute passed the values through on the form. Thanks for the reply!!
Mark Struzinski
Thanks! I too thought the id attribute would do it...
BioBuckyBall
This is surprising as everything has seemingly been pointing towards using the id only. Things not as they seemed..to me anyway..
Mark Redman
@Mark, this is required per the HTTP spec. `id` = how to find it in the DOM. `name` = what gets submitted in the `form`.
Craig Stuntz
@Craig Stuntz: Thanks for the clarification.
Mark Redman
Sure enough, he's right! (Link love: http://www.w3.org/TR/html401/interact/forms.html#h-17.2 ) controls need a 'name' attribute when posting. +1 for helping me stop pull my hair out.
Dan Esparza
A: 

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.

dudeNumber4