【问题标题】:How to get the current route ID within a View from the URL (ASP.NET MVC)如何从 URL (ASP.NET MVC) 获取视图中的当前路由 ID
【发布时间】:2010-11-02 01:07:01
【问题描述】:

在从 /Controller/Action/1 等 URL 返回的视图中(假设默认路由为 controller/action/id),如何从视图中访问 ID?

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

【问题讨论】:

  • 为什么不想将它添加到 ViewData 字典中?这就是为您所描述的内容提供的机制。

标签: asp.net-mvc


【解决方案1】:

我想这就是你要找的东西:

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

【讨论】:

  • +1 简单、有效,正是问题所要求的!
  • 为什么这在网络上的其他任何地方都没有正确记录?呸呸呸
  • 这个答案没有充分解释它如何缓解反射型 XSS。投反对票。
  • @CervEd 这不是问题的一部分,但如果它对您很重要,则生成的字符串将被剃刀引擎转义,除非您覆盖它。此外,控制器还具有针对潜在危险路由值的保护。
  • @Francisco 安全性对我很重要,大概用户也很重要,请验证用户输入。很抱歉,但这个答案很糟糕,很多人会将其复制粘贴到生产中。请考虑将其取下。 owasp.org/www-community/ASP-NET_Request_Validation 你所做的就是依赖 .NET 来为你进行所有可能的 XSS 验证。您从路线中获取整数。在控制器中执行此操作。验证它是一个整数。不要这样做
【解决方案2】:

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

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

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

如果 ID 值确实是传递给您的视图的唯一模型信息,那么您可以将 ID 本身用作模型。那么你的action方法的返回值就是View(id),你就不需要使用ViewData了。

【讨论】:

  • 不幸的是视图没有模型。关于ViewData["id"] = id; 的一些事情并不适合我。我想这是我多次使用这种模式的事实。一次或两次,我可能不会介意。谢谢。
【解决方案3】:

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

【讨论】:

  • 或者只是制作一个漂亮的小 ViewDataWrapper 类,它可以为 ya 管理“如果这是 null 该怎么办”的东西。 . .
【解决方案4】:

如果您使用的是 .NET Core

使用此代码

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

【讨论】:

    【解决方案5】:

    Razor 中的简单答案:

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

    在 ASP.NET Core 中

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

    【讨论】:

      【解决方案6】:

      我们可以将id 传递为Route DataQueryString,所以为了同时支持它们,我推荐这种方式:

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

      【讨论】:

        【解决方案7】:

        我认为您可以直接在 url 操作中使用 Url.RequestContext.RouteData.Values["id"]

        【讨论】:

        • 这对我有用。在 ASP.NET Core 中,它是 Url.ActionContext.RouteData.Values["id"] 以防其他人正在寻找它。
        【解决方案8】:

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

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

        对于它的价值,我通常name 我的视图模型是这样的:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-14
          • 2012-04-21
          • 1970-01-01
          相关资源
          最近更新 更多