如何从URL(ASP.NET MVC)中获取视图中的当前路由ID


78

在从/ Controller / Action / 1之类的URL返回的视图中(假设控制器/ action / id的默认路由),如何从视图中访问ID?

我不想在处理请求时将其添加到操作级别的ViewData字典中。


2
您为什么不想将其添加到ViewData词典中?这就是为您所描述的内容提供的机制。
亚当·拉尔夫

Answers:


181

我认为这是您要寻找的:

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

+1简单,有效,这正是问题的根源!
Losbear 2012年

为什么在网络上其他任何地方都没有正确记录呢?grrrr
Ayyash

该答案不足以解释它如何缓解Reflected XSS。不赞成投票。
CervEd

15

ViewData正是这样做的正确方法。

您的另一个选择是将包含ID的模型传递给视图。

编辑:在不完全知道您要做什么的情况下,很难给出更具体的建议。为什么需要ID,但不需要其他任何模型数据?您的控制器真的只将Id字段发送到视图吗?很难想象情况是什么。

如果ID值确实是传递给视图的唯一模型信息,则可以将ID本身用作模型。然后,您的操作方法的返回值为,View(id)并且您无需使用ViewData。


不幸的是,视图没有模型。ViewData["id"] = id;只是有些事情不适合我。我猜这是我多次使用此模式的事实。一两次,我可能不会介意。谢谢。
JMS 2009年

3

将其添加到视图数据是正确的事情。至于如何添加它,您总是可以添加一个自定义ActionFilter,该自定义将从路由字典中获取自定义并将其推送到viewdata中。


我喜欢这个想法,通过正确的空值检查,您可以将其放在控制器的顶部,并且应该始终可以将它放在应该存在的位置。
布莱尔·斯科特

或者只是制作一个不错的ViewDataWrapper小类,它可以为ya管理“如果为null时该怎么办”的工作。。。
Wyatt Barnett

2

我们可以通过idasRoute DataQueryString,因此为了支持它们两者,我建议采用这种方式:

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

2

我认为您可以直接在网址操作Url.RequestContext.RouteData.Values [“ id”]中使用


1
这对我有用。在ASP.NET Core中,如果有人在寻找它,则为Url.ActionContext.RouteData.Values [“ id”]。
安迪


1

只是我的两分钱,但我总是使用视图模型将任何数据传递到我的视图。即使int像ID这样的ID一样简单。

这样做使访问此值变得微不足道,因为MVC会为您完成所有工作。

我通常将这样的视图模型命名为:

{Controller}{ViewName}ViewModel

这有助于使事情保持规模化。

一个例子:

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

1

如果您使用的是.NET Core

使用此代码

Url.ActionContext.RouteData.Values["id"]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.