2009-06-11 23 views
74

All'interno della vista che viene restituito da un URL come/Controller/Azione/1 (supponendo che il percorso di default del regolatore/action/id), come posso ottenere l'accesso all'ID dalla vista?Come ottenere l'ID percorso corrente all'interno di un Vista dal URL (ASP.NET MVC)

Io non voglio avere per aggiungerla al dizionario Viewdata a livello di azione quando gestisce la richiesta.

+2

Perché non si desidera aggiungere al dizionario Viewdata? Questo è il meccanismo che viene fornito esattamente per ciò che stai descrivendo. –

risposta

167

Penso che questo sia quello che stai cercando:

<%=Url.RequestContext.RouteData.Values["id"]%> 
+0

+1 semplice, efficace ed è esattamente ciò che la domanda ha richiesto! – Losbear

+0

perché non è documentato correttamente da nessun'altra parte sul web? grrrr – Ayyash

13

ViewData è esattamente il modo giusto per farlo.

L'altra opzione sarebbe quella di passare un modello che contiene ID alla vista.

Modifica: Senza sapere esattamente cosa si sta facendo, è difficile dare consigli più specifici. Perché hai bisogno di un ID, ma non di altri dati del modello? Il tuo controller in realtà invia solo il campo Id alla vista? È difficile immaginare quale sia lo scenario.

Se il valore ID è veramente l'unica informazione modello che è stato passato alla vista, allora si potrebbe utilizzare l'ID stesso come modello. Quindi il valore di ritorno del tuo metodo di azione sarebbe View(id) e non avresti bisogno di utilizzare ViewData.

+0

Sfortunatamente la vista non ha un modello. Qualcosa su 'ViewData [" id "] = id;' semplicemente non si adatta a me. Immagino sia il fatto che sto usando questo schema un bel po 'di volte.Una o due volte e probabilmente non mi dispiacerebbe. Grazie. – JMS

3

aggiungendolo al viewdata è la cosa giusta da fare. Per quanto riguarda come aggiungerlo, è sempre possibile aggiungere un numero personalizzato ActionFilter che lo preleva dal dizionario del percorso e lo inserisce nel viewdata.

+0

Mi piace l'idea, con un corretto controllo del valore nullo si dovrebbe semplicemente metterlo in cima al controller e si dovrebbe essere in grado di fare sempre affidamento sul fatto che sia lì quando dovrebbe essere. –

+0

Oppure basta creare una piccola classe ViewDataWrapper che possa gestire la roba "cosa fare se questo è nulla" per te. . . –

+0

Fantastica idea, grazie! – JMS

-1

ho appena usato <%= model.id %> e funziona

+2

Se si utilizza lo stesso modello attraverso la vista, funzionerà, ma se si consente di dire una vista parziale che utilizza un modello diverso da quello restituirà l'id dei modelli anziché quello nell'URL – AirWolf

1

Possiamo passare id come Route Data o QueryString, per così sostegno entrambi loro mi raccomando in questo modo:

var routeValues=Url.RequestContext.RouteData.Values; 
var paramName = "id"; 
var id = routeValues.ContainsKey(paramName)? 
     routeValues[paramName]: 
     Request.QueryString[paramName]; 
1

Penso che si possa indirizzare l'utilizzo in azione url Url.RequestContext.RouteData.Values ​​[ "ID"]

0

Solo i miei due centesimi, ma ho sempre usare la vista modelli per il passaggio di tutti i dati per le mie opinioni. Anche se è semplice quanto richiedere uno int come l'id.

In questo modo si rende l'accesso a questo valore banale, come MVC fa tutto il lavoro per voi.

Per quel che vale io di solito name mio punto di vista modelli in quanto tali:

{Controller}{ViewName}ViewModel

Questo aiuta mantiene le cose organizzate su larga scala.

Un esempio:

// ~/ViewModels/HomeEditViewModel.cs 
public class HomeEditViewModel 
{ 
    public int Id { get; set; } 
} 

// ~/Controllers/HomeController.cs 
public IActionResult Edit(int id) 
{ 
    return View(new HomeEditViewModel() { Id = id }); 
} 

// ~/Views/Home/Edit.cshtml 
@model HomeEditViewModel 

<h1>Id: @Model.Id</h1> 
Problemi correlati