2009-09-18 40 views
6

Ho una vista parziale resa da più viste restituite da diversi metodi di azione.ASP.NET MVC - Come ottenere l'azione corrente da una vista parziale?

La vista parziale ha una forma che dovrebbe postare di nuovo al metodo di azione chiamato.

è la mia comprensione che se mi basta chiamare

<% Html.BeginForm(); %> 

dall'interno di una vista, attributo di azione del form punterà alla chiamata metodo di azione. Non riesco a farlo, perché ho bisogno di impostare l'attributo ID del modulo per scopi javascript. Il sovraccarico di Html.BeginForm che mi consente di impostare gli attributi html richiede anche un controllo e un'azione espliciti. Così, invece di utilizzare l'helper HTML, ho potuto solo scrivere l'elemento del modulo fuori come:

<form action="<%=(NEED TO SOMEHOW GET THE URL TO THE CURRENT ACTION) %>" method="post" id="myForm"> 

io non sono solo sicuro di come ottenere l'URL.

risposta

14

Basta passare null per il controller e l'azione. I valori corretti saranno sostituiti. Ad esempio:

<% using (Html.BeginForm(null, null, FormMethod.Post, new { id = "employeeGroupForm" })) 
+1

+1 - Certo, c'è il mio modo, e poi c'è il modo più semplice :) –

+0

Mi hai fatto ridere! :) –

0

In tale situazione, avrei probabilmente solo avere il controller (o la vista padre) mettere l'URL di destinazione appropriata nel modello/Viewdata.

Per quanto riguarda come, all'interno del vostro controller:

public ActionResult MyAction() { 
    MyModel m = new MyModel(); 

    ... 

    m.MyControlAction = "MyAction"; 
    m.MyControlController = "MyController"; 

    return View("MyView", m); 
} 

Quindi secondo lei:

Html.RenderPartial("MyControl", ViewData.Model); 

E nella vostra visione parziale:

Html.BeginForm(ViewData.Model.MyControlController, ViewData.Model.MyControlAction, ...) 

Per un design più pulito, è probabilmente vorrebbe che i membri MyControlController e MyControlAction arrivino da un'interfaccia che ogni modello che utilizza quel controllo deve implementare. Quindi avere la vista parziale prendere un modello fortemente tipizzato con quel tipo di interfaccia.

+0

concordato, sembra che l'aggiunta di questo al viewdata sarebbe la cosa più avanti dritto fare. – Amir

+0

La risposta di Craig ha funzionato per me, ma come si può ottenere l'url corrente nel controller? Se lo facessi, probabilmente memorizzerei l'url in viewdata da un metodo overactored overactossing, in modo che non dovessi continuare a farlo in ogni metodo di azione. –

+0

@Ronnie - Non è necessario l'URL corrente per-se, hai solo bisogno del controller e dell'azione correnti - che ovviamente sapresti quando sei all'interno del metodo di azione di un controller :) –

2

ViewContext.RouteData.Values ​​[ "azione"]

o qualcosa di simile ottiene il lavoro fatto

+0

Non conosco l'azione in fase di progettazione. –

+0

Mi dispiace correggere la chiamata, che ottiene il valore dell'azione dal percorso Dati utilizzati per trovare l'azione corretta. – AndreasN

Problemi correlati