2009-06-11 27 views
74

Dentro de la vista que se devuelve desde una URL como/Controller/Action/1 (suponiendo la ruta predeterminada de controlador/acción/id.), ¿cómo puedo obtener acceso a la ID desde la Vista?Cómo obtener el ID de ruta actual dentro de una Vista desde la URL (ASP.NET MVC)

No quiero tener que agregarlo al diccionario ViewData en el nivel de acción cuando se maneja la solicitud.

+2

¿Por qué no desea agregar al diccionario ViewData? Ese es el mecanismo que se proporciona para exactamente lo que está describiendo. –

Respuesta

167

Creo que esto es lo que está buscando:

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

+1 ¡simple, efectivo y es exactamente lo que la pregunta solicitó! – Losbear

+0

¿por qué no está bien documentado en otro lugar en la web? grrrr – Ayyash

13

ViewData es exactamente la forma correcta de hacerlo.

Su otra opción sería pasar un modelo que contiene ID a la vista.

Edit: Sin saber exactamente lo que está haciendo, es difícil dar consejos más específicos. ¿Por qué necesita una identificación, pero no otros datos de modelos? ¿Su controlador realmente solo está enviando el campo Id a la vista? Es difícil imaginar cuál es el escenario.

Si el valor de ID es realmente el único modelo de información que se está pasando a su vista, entonces podría usar la misma ID como modelo. Entonces el valor de retorno de su método de acción sería View(id) y no necesitaría usar ViewData.

+0

Lamentablemente, la vista no tiene un modelo. Algo sobre 'ViewData [" id "] = id;' simplemente no me sienta bien. Supongo que es el hecho de que estoy usando este patrón bastantes veces.Una o dos veces y probablemente no me importaría. Gracias. – JMS

3

Agregarlo a la viewdata es lo correcto. En cuanto a cómo agregarlo, siempre puede agregar un ActionFilter personalizado que lo agarra del diccionario de ruta y lo empuja a los datos de visualización.

+0

Me gusta esa idea, con la comprobación del valor nulo correcto, simplemente colocaría eso en la parte superior de su controlador y debería poder confiar siempre en que está allí cuando se supone que debe estar. –

+0

O simplemente crea una pequeña clase de ViewDataWrapper que podría administrar el "qué hacer si esto es nulo" para ti. . . –

+0

idea impresionante, gracias! – JMS

-1

acabo de utilizar <%= model.id %> y funciona

+2

Si está utilizando el mismo modelo en la vista, funcionará, pero si tiene una vista parcial que utiliza un modelo diferente, devolverá los modelos Id en lugar de los de la URL – AirWolf

1

Podemos pasar id como Route Data o QueryString, por lo que apoyo tanto de ellos recomiendo esta manera:

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

Creo que se puede dirigir a su uso en la acción url Url.RequestContext.RouteData.Values ​​[ "id"]

0

Sólo mis dos centavos, pero siempre utilizar la vista de los modelos para pasar los datos a mis puntos de vista. Incluso si es tan simple como necesitar un int como la identificación.

Hacer esto hace que el acceso a este valor sea trivial, ya que MVC hace todo el trabajo por usted.

Por lo que vale la pena Me suelen name mis modelos de vista, tales como:

{Controller}{ViewName}ViewModel

Esto ayuda a mantener las cosas organizadas a escala.

Un ejemplo:

// ~/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> 
Cuestiones relacionadas