2009-02-02 12 views
28

Ich poste ein sehr einfaches Formular mit einer Methode, die ich häufig in der Vergangenheit verwendet habe. Es mag einfacher sein, meinen Code zu zeigen, als eine langwierige Erklärung einzugeben. Hier ist der HTML:FormCollection Empty on Form Post in ASP.NET-MVC

<% 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();%> 

Und hier ist der 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()); 
} 

Der Button das Formular abgesendet hat, und das Verfahren wird aufgerufen, aber das Formularobjekt in meinem Parameter definiert ist leer. Ich habe auch Request.Form ausprobiert und bekomme das gleiche Ergebnis. Fehle ich hier etwas?

Antwort

82

Keiner Ihrer Eingänge hat ein Namensattribut. Kein Name = nicht in der FormCollection.

+8

Ouch eingereicht - das ist, was ich für das Heranwachsen auf WebForms bekommen !! Ich dachte, das ID-Attribut übermittelte die Werte im Formular. Danke für die Antwort!! –

+1

Danke! Ich dachte auch, dass das ID-Attribut es tun würde ... –

+0

Dies ist überraschend, da alles darauf hinweist, nur die ID zu verwenden. Dinge nicht so, wie sie mir schienen .. –

0

Ich wünschte, ich könnte dies als einen einfachen Kommentar posten, aber ich habe dieses Privileg nicht ... Ich habe alle meine Namensattribute hinzugefügt, und immer noch keine Freude. Denken Sie daran, Ihr Namensattribut Ihrem Formular selbst hinzuzufügen. Muss die Überladung für HTML.BeginForm verwenden, das htmlAttributes akzeptiert.

3

Ich hatte dieses Problem und erkannte dann, dass ich alle INPUT-Steuerelemente deaktiviert hatte, bevor ich das Formular abschickte (als UX-Feature).

+0

Wenn Sie die Felder deaktivieren, werden sie aus der FormCollection entfernt? Ich habe das gleiche Problem. – WEFX

0

Ich sehe, dass diese Frage bereits beantwortet wird. Es folgt ein weiterer Ansatz, den ich in einer MVC-Ansicht verwendet habe, als die Formularsammlung leer war. Mit JavaScript/jQuery werden Name-Wert-Paare für ein verborgenes Steuerelement festgelegt, das an das Formular angehängt wird.

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(); 
      }); 

Formular

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

Siehe Forms

Wenn ein Formular zur Bearbeitung vorgelegt wird, müssen einige Kontrollen ihre name pa mit ihrem aktuellen Wert und diese Paare sind mit dem Formular