How to get the current route ID within a View from the URL (ASP.NET MVC)

asp.net Mvc

asp.net Mvc Problem Overview


Within the view that is returned from a URL such as /Controller/Action/1 (assuming the default route of controller/action/id), how can I get access to the ID from within the View?

I don't want to have to add it to the ViewData dictionary at the action level when handling the request.

asp.net Mvc Solutions


Solution 1 - asp.net Mvc

I think this is what you're looking for:

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

Solution 2 - asp.net Mvc

ViewData is exactly the right way of doing this.

Your other option would be to pass a model that contains ID to the view.

Edit: Without knowing exactly what you're tying to do, it's tough to give more specific advise. Why do you need an ID, but not any other model data? Is your controller really only sending the Id field to the view? It's hard to imagine what the scenario is.

If the ID value is truly the only model information that is being passed to your view, then you could use the ID itself as the model. Then the return value of your action method would be View(id) and you wouldn't need to use ViewData.

Solution 3 - asp.net Mvc

Adding it to the viewdata is the right thing to do. As for how to add it, you could always add a custom ActionFilter which grabs it from the route dictionary and pushes it into the viewdata.

Solution 4 - asp.net Mvc

Simple Answer In Razor:

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

In ASP.NET Core

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

Solution 5 - asp.net Mvc

If you are using .NET Core

Use this code

Url.ActionContext.RouteData.Values["id"]

Solution 6 - asp.net Mvc

We can pass id as Route Data or QueryString, so to support both of them i recommend this way:

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

Solution 7 - asp.net Mvc

I think you can direct use in url action Url.RequestContext.RouteData.Values["id"]

Solution 8 - asp.net Mvc

Just my two cents, but I always use view models for passing any data to my views. Even if it's as simple as needing an int like the id.

Doing this makes accessing this value trivial, as MVC does all the work for you.

For what it's worth I typically name my view models as such:

{Controller}{ViewName}ViewModel

This helps keeps things organized at scale.

An example:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJMSView Question on Stackoverflow
Solution 1 - asp.net MvcFranciscoView Answer on Stackoverflow
Solution 2 - asp.net MvcCoderDennisView Answer on Stackoverflow
Solution 3 - asp.net MvcWyatt BarnettView Answer on Stackoverflow
Solution 4 - asp.net MvcTroyStevenView Answer on Stackoverflow
Solution 5 - asp.net MvcPoyi HongView Answer on Stackoverflow
Solution 6 - asp.net MvcRamin BateniView Answer on Stackoverflow
Solution 7 - asp.net MvcA.M. PatelView Answer on Stackoverflow
Solution 8 - asp.net MvcpimView Answer on Stackoverflow