2010-03-17 23 views
10

Con ASP.net MVC è possibile POSTARE un modulo a un'azione del controllore che include parametri non presenti nel modulo, ma dall'URL?ASP.NET MVC - Metodo di azione POST con parametri aggiuntivi dall'URL

Per esempio

Il metodo d'azione in GroupController:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(int idOne, int idTwo, Model model) 
    { ... } 

Il percorso:

"{controller}/{action}/{idOne}/{idTwo}" 

URL Pubblicato:

/Employee/Show/1/42 

In questo esempio, il modulo viene essere pubblicato su un altro controller, il modello ha il valore corretto, tuttavia gli altri parametri hanno valori predefiniti 0.

Il comportamento che mi aspettavo è che il ModelBinder vedrebbe che ho due parametri che corrispondono al percorso specificato e assegnano la corrente valori di 1 e 42 ai parametri nello stesso modo in cui un'operazione GET funziona.

Questo comportamento non è supportato o mi manca qualcosa?

EDIT: Per essere chiari, il modulo a vista Show per il controller Employee contiene una forma che viene intervento a un controller diverso. Possiamo chiamarlo Group.

L'URL di azione sotto forma assomiglia a questo

/Groups/Create/0/0 

La forma è dichiarato come segue

Html.BeginForm("Create", "Groups") 

Dopo aver provato molti sovraccarichi diversi per Html.BeginForm ho trovato che i parametri sono mappati solo quando il modulo l'URL di azione corrisponde all'URL corrente nella barra degli indirizzi del browser.

Quindi, se si naviga all'URL /Groups/Create/1/42 avrò un nuovo modulo. Se poi invio il modulo, i valori della route URL vengono passati all'azione POST.

+2

vorrei provare la definizione del percorso per includere il modello e impostarlo come predefinito è NULL e vedere cosa succede. '{controller}/{action}/{idOne}/{idTwo}/{Model}' –

risposta

8

Se ho compreso correttamente la tua domanda, vuoi che loelemento di rendering sia indicato con l'URL contenente i valori di percorso. Questo dovrebbe essere possibile con uno degli overload del metodo HtmlHelper.BeginForm() estensione:

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post); 

fatemi sapere se ho ricevuto la tua domanda tutto sbagliato :)

+0

Sort of. Come ho affermato nella domanda, l'azione for contiene già un URL con i valori di percorso corretti (1 e 42 dell'esempio). Il problema è quando passo all'azione di esecuzione, i due parametri hanno valore 0. Ho provato il tuo suggerimento, ma i valori erano ancora 0. – Karl

2

Sono abbastanza sicuro che si può inserire solo i dati del modulo dagli input all'interno del modulo. Hai preso in considerazione il rendering della vista in modo tale da creare valori di input del modulo al di fuori dell'URL (magari con un helper HTML?).

UPDATE: Se non si desidera utilizzare il modulo, utilizzare ControllerContext.RouteData.Values["idOne"] anziché passarlo attraverso la firma del metodo.

+0

All'interno del modulo ho fatto una query ai valori del percorso, ViewContext.RouteData.Values ​​[" idOne "], tuttavia nella pagina finale renderizzata ha un valore di 0, non il valore della rotta. Esiste un altro approccio per ottenere i valori correnti della route URL da una vista/parziale? – Karl

+0

Se si utilizza un'estensione helper Html, si dovrebbe essere in grado di vederlo dall'istanza helper stessa. La sintassi sembrerebbe 'helper.ViewContext.RouteData.Values ​​[" idOne "]'. In alternativa, è possibile memorizzare quei valori ID in un modello di vista e passarlo alla vista in quel modo. –

+0

+1 Stessi pensieri. Perché non includerlo nei valori come campi nascosti all'interno di Html.BeginForm ("Crea", "Gruppi")? Inoltre, dovresti essere "Pubblicazione" per creare un nuovo modulo? – Ahmad

0

Recentemente ho avuto questo problema troppo, e perché ho avuto un percorso diverso, era mappatura per il percorso di default, senza prendere in considerazione il params percorso in più che stavo passando in.

Quindi, per farlo funzionare rapidamente, ho scritto il modulo utilizzando i tag del modulo e ho usato @ Url.Action per creare l'azione richiesta.

0

Una volta raggiunta la vista Crea, i valori del percorso utilizzati per arrivarci devono essere nuovamente postati all'azione post.

Quindi, un'opzione sta avendo una coppia di hiddens, per contenere gli ID che provengono dal percorso. In questo modo, una volta pubblicati i formas, i suoi valori vengono pubblicati insieme agli altri input.

0

Ho avuto un problema simile, la configurazione RouteConfig ha risolto questo problema.

public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      ... 
      routes.MapRoute(
      "MyRoute", 
      "{controller}/{action}/{idOne}/{idTwo}", 
      new 
      { 
       controller = "Employee", // as an example 
       action = "Show", 
       idOne = UrlParameter.Optional, 
       idTwo= UrlParameter.Optional 
      }, new { idOne = @"\d{1,5}" }); 

     } 
    } 

... E ... Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post)) 

scrive un tag di apertura alla risposta. Quando l'utente invia il modulo , la richiesta verrà elaborata dalla destinazione del percorso. Questo membro è sovraccarico. Per informazioni complete su questo membro, tra cui sintassi, utilizzo ed esempi, fare clic su un nome nell'elenco sovraccarico .

E tutto funziona

Problemi correlati