2009-02-02 19 views
28

Sto pubblicando un modulo molto semplice utilizzando un metodo che ho usato frequentemente in passato. Potrebbe essere più facile mostrare il mio codice piuttosto che digitare una lunga spiegazione. Ecco il codice 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();%> 

Ed ecco il codice del controller:

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

L'presentare i messaggi pulsante il modulo e il metodo viene richiamato, ma l'oggetto forma definita nel mio parametro è vuoto. Ho anche provato Request.Form e ottengo lo stesso risultato. Mi sto perdendo qualcosa qui?

risposta

82

Nessuno degli ingressi ha un attributo nome. Nessun nome = non in FormCollection.

+8

Ouch - questo è quello che ottengo per crescere su WebForms !! Pensavo che l'attributo id passasse i valori attraverso il form. Grazie per la risposta!! –

+1

Grazie! Anch'io ho pensato che l'attributo id lo avrebbe fatto ... –

+0

Questo è sorprendente perché tutto sembra aver puntato solo sull'uso dell'ID. Le cose non come sembravano ... per me comunque .. –

0

Vorrei poter postare questo come un semplice commento, ma non ho quel privilegio ... Ho aggiunto tutti gli attributi del mio nome, e ancora nessuna gioia. Ricorda di aggiungere il tuo attributo nome al tuo modulo stesso. È necessario utilizzare il sovraccarico per HTML.BeginForm che accetta htmlAttributes.

3

Ho riscontrato questo problema e ho realizzato che avevo disattivato tutti i controlli INPUT prima di inviare il modulo (come funzionalità UX).

+0

Quando disattivi i campi, rimuoverli da FormCollection? Mi sembra di avere lo stesso problema. – WEFX

0

Vedo che questa domanda ha già una risposta. Di seguito è riportato un altro approccio che ho utilizzato in una visualizzazione MVC, quando la raccolta moduli era vuota. Usando JavaScript/jQuery, imposta coppie nome-valore su un controllo nascosto che viene aggiunto al modulo.

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

Modulo

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

consultare Forms

Quando un modulo viene inviato per l'elaborazione, alcuni controlli hanno il loro name pa con il loro valore attuale e queste coppie sono presentate con il modulo