So erhalten Sie die aktuelle Routen-ID in einer Ansicht über die URL (ASP.NET MVC)

78

Wie kann ich in der Ansicht, die von einer URL wie / Controller / Action / 1 zurückgegeben wird (unter der Annahme der Standardroute von controller / action / id), über die Ansicht auf die ID zugreifen?

Ich möchte es nicht auf Aktionsebene zum ViewData-Wörterbuch hinzufügen müssen, wenn die Anforderung bearbeitet wird.

JMS
quelle
2
Warum möchten Sie es nicht zum ViewData-Wörterbuch hinzufügen? Dies ist der Mechanismus, der genau für das bereitgestellt wird, was Sie beschreiben.
Adam Ralph

Antworten:

181

Ich denke, das ist, wonach Sie suchen:

<%=Url.RequestContext.RouteData.Values["id"]%>
Francisco
quelle
+1 einfach, effektiv und genau das, wonach die Frage gestellt wurde!
Losbear
Warum ist dies nirgendwo anders im Web richtig dokumentiert? grrrr
Ayyash
Diese Antwort erklärt nicht ausreichend, wie Reflected XSS gemindert wird. Abgestimmt.
CervEd
15

ViewData ist genau der richtige Weg, dies zu tun.

Sie können auch ein Modell mit einer ID an die Ansicht übergeben.

Bearbeiten: Ohne genau zu wissen, was Sie tun möchten, ist es schwierig, spezifischere Ratschläge zu geben. Warum benötigen Sie eine ID, aber keine anderen Modelldaten? Sendet Ihr Controller wirklich nur das ID-Feld an die Ansicht? Es ist schwer vorstellbar, wie das Szenario aussieht.

Wenn der ID-Wert wirklich die einzige Modellinformation ist, die an Ihre Ansicht übergeben wird, können Sie die ID selbst als Modell verwenden. Dann wäre der Rückgabewert Ihrer Aktionsmethode View(id)und Sie müssten ViewData nicht verwenden.

CoderDennis
quelle
Leider hat die Ansicht kein Modell. Irgendetwas ViewData["id"] = id;passt einfach nicht zu mir. Ich denke, es ist die Tatsache, dass ich dieses Muster einige Male benutze. Ein- oder zweimal und es würde mir wahrscheinlich nichts ausmachen. Vielen Dank.
JMS
3

Das Hinzufügen zu den Ansichtsdaten ist das Richtige. Zum Hinzufügen können Sie jederzeit eine benutzerdefinierte ActionFilterDatei hinzufügen, die es aus dem Routenwörterbuch abruft und in die Ansichtsdaten überträgt.

Wyatt Barnett
quelle
Ich mag diese Idee, mit der richtigen Nullwertprüfung würden Sie das einfach oben auf Ihren Controller setzen und Sie sollten sich immer darauf verlassen können, dass es da ist, wenn es sein soll.
Blair Scott
Oder erstellen Sie einfach eine nette kleine ViewDataWrapper-Klasse, die das "Was tun, wenn dies null ist" -Stoff für Sie verwaltet. . .
Wyatt Barnett
2

Wir können idals Route Dataoder übergebenQueryString , um beide zu unterstützen, empfehle ich Folgendes:

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

Ich denke, Sie können direkt in der URL-Aktion Url.RequestContext.RouteData.Values ​​["id"] verwenden.

AM Patel
quelle
1
Das hat bei mir funktioniert. In ASP.NET Core ist es Url.ActionContext.RouteData.Values ​​["id"], falls jemand anderes danach sucht.
Andy
2

Einfache Antwort in Razor:

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

In ASP.NET Core

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

Nur meine zwei Cent, aber ich verwende immer Ansichtsmodelle, um Daten an meine Ansichten zu übergeben. Auch wenn es so einfach ist, wie einen Ausweis zu benötigen int.

Wenn Sie dies tun, ist der Zugriff auf diesen Wert trivial, da MVC die gesamte Arbeit für Sie erledigt.

Für das, was wert Ich es in der Regel nennt meine Ansicht Modelle als solche:

{Controller}{ViewName}ViewModel

Dies hilft, die Dinge im Maßstab zu organisieren.

Ein Beispiel:

// ~/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>
Zuhälter
quelle
1

Wenn Sie .NET Core verwenden

Verwenden Sie diesen Code

Url.ActionContext.RouteData.Values["id"]
Poyi Hong
quelle