Cómo obtener el ID de ruta actual dentro de una vista desde la URL (ASP.NET MVC)

78

Dentro de la vista que se devuelve desde una URL como / Controller / Action / 1 (asumiendo la ruta predeterminada de controller / action / id), ¿cómo puedo acceder a la ID desde dentro de la Vista?

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

JMS
fuente
2
¿Por qué no quiere agregarlo al diccionario ViewData? Ese es el mecanismo que se proporciona exactamente para lo que está describiendo.
Adam Ralph

Respuestas:

181

Creo que esto es lo que estás buscando:

<%=Url.RequestContext.RouteData.Values["id"]%>
Francisco
fuente
+1 simple, efectivo y es exactamente lo que la pregunta pidió.
Losbear
¿Por qué no está esto debidamente documentado en ningún otro lugar de la web? grrrr
Ayyash
Esta respuesta no explica adecuadamente cómo mitiga Reflected XSS. Voto en contra.
CervEd
16

ViewData es exactamente la forma correcta de hacer esto.

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

Editar: sin saber exactamente lo que quiere hacer, es difícil dar un consejo más específico. ¿Por qué necesita una identificación, pero no otros datos del modelo? ¿Su controlador realmente solo envía el campo Id a la vista? Es difícil imaginar cuál es el escenario.

Si el valor de ID es realmente la única información del modelo que se pasa a su vista, entonces puede usar el 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.

CoderDennis
fuente
Desafortunadamente, la Vista no tiene modelo. Algo sobre ViewData["id"] = id;simplemente no me sienta bien. Supongo que es el hecho de que estoy usando este patrón varias veces. Una o dos veces y probablemente no me importaría. Gracias.
JMS
3

Agregarlo a la vista de datos es lo correcto. En cuanto a cómo agregarlo, siempre puede agregar un personalizado ActionFilterque lo tome del diccionario de ruta y lo inserte en la vista de datos.

Wyatt Barnett
fuente
Me gusta esa idea, con la verificación adecuada del valor nulo, simplemente lo pondría en la parte superior de su controlador y debería poder confiar siempre en que estará allí cuando se supone que debe estar.
Blair Scott
O simplemente cree una pequeña y agradable clase ViewDataWrapper que pueda administrar las cosas "qué hacer si esto es nulo" para usted. . .
Wyatt Barnett
2

Podemos pasar idcomo Route DataoQueryString , así que para apoyar a ambos, recomiendo de esta manera:

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

Creo que puedes usarlo directamente en la acción de URL Url.RequestContext.RouteData.Values ​​["id"]

AM Patel
fuente
1
Esto funcionó para mí. En ASP.NET Core es Url.ActionContext.RouteData.Values ​​["id"] en caso de que alguien más lo esté buscando.
Andy
2

Si está utilizando .NET Core

Usa este código

Url.ActionContext.RouteData.Values["id"]
Poyi Hong
fuente
2

Respuesta simple en Razor:

@Url.RequestContext.RouteData.Values["id"]

En ASP.NET Core

@Url.ActionContext.RouteData.Values["id"]
TroySteven
fuente
1

Solo mis dos centavos, pero siempre uso modelos de vista para pasar cualquier dato a mis vistas. Incluso si es tan simple como necesitar un intid.

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

Por lo que vale, normalmente nombro mis modelos de vista como tales:

{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>
pim
fuente