使用自定义段变量设置 ASP.Net MVC 4 路由

2024-04-07

我刚刚开始开发一个具有几个区域的应用程序(基本网格主控/详细信息类型系统..),我正在考虑利用 MVC 中良好的路由功能(特别是 4),但我“只是不明白”我相信。

目前唯一定义的路线是基本路线:

routes.MapRoute("Default", 
            "{controller}/{action}/{id}", 
            new { controller = "Account", action = "Index", id = UrlParameter.Optional }
        );

这很好,它适用于我们定义的区域,所以我假设它必须知道用户在哪里,并根据用户所在的位置/区域上下文路由到适当的控制器..到目前为止很好..

现在,我正在尝试建立一条可以处理的新路线

/someController/someAction/{statusName} 

具体来说是这样的:

/OrderManager/List/New 

AND

/OrderManager/List/Viewed

其中“New”是“New”状态,操作签名如下所示:

public ActionResult List(string statusName)

我假设我可以在默认路由下面添加新路由来标识“statusName”而不是 Id,但是当然,路由机制 H 如何知道两者之间的区别:

/控制器1/动作1/15

/控制器2/动作2/新

我确实尝试以以下形式添加“静态”路由

routes.MapRoute("Default", 
            "ControllerName/ControllerAction/{statusName}", 
            new { statusName = UrlParameter.Optional }
        );

我以为我可以“劫持”那条路线并用它做一些特别的事情,但要知道效果,路由器会在第一场比赛时停止?我认为无论如何这是解决这个问题的错误方法..

所以现在我正在经历这样的想法:

/somecustomroutename/somesortValue

前任。 /OrderManagerList/viewNew

这些路线基本上是“别名”。我原以为添加以下路由就可以解决问题:

 routes.MapRoute("Default_List",
          "OrderManagerList/{statusName}",
          new {controller="OrderManager", action="List", statusName= UrlParameter.Optional }
      );

与 OrderManager 控制器上的关联操作:

public ActionResult List(string statusName)

无论我尝试什么,参数都是空的,或者“找不到资源”

我知道控制器需要有一个相应的视图文件..但这不是这里的问题,问题是我尝试理解路由..

所以我的问题.. 从根本上来说,我对 MVC (4) 中的路由缺少什么?甚至一些像我这样的傻瓜能够理解的好文章?

我的理解;定义一条路线,并映射它的“端点”..但是,我认为我不理解机器所做的假设..

无论如何,请告诉我是否需要进一步解释/编辑。

提前致谢。


路由的基本原则是从上到下进行评估,路由系统使用第一个匹配,而不是最佳匹配。

这意味着您必须按照具体的顺序对路线进行排序,首先是最具体的路线,最后是最一般的路线。

记住这个原则,让我们看看你的情况。最初,您仅定义了默认路由:

routes.MapRoute("Default", 
        "{controller}/{action}/{id}", 
        new { controller = "Account", action = "Index", id = UrlParameter.Optional }
    );

URL 模式为“{controller}/{action}/{id}”。就其本身而言,这将匹配任何三段 URL,并且不会匹配任何少于三段的 URL。然而,第三输入参数是默认参数,其定义第一段和第二段的默认值并指示第三段是可选的。这样做的下一个效果是使路由匹配具有 0、1、2 或 3 段的 URL。

现在您想要添加一个路由,其中​​第三个 URL 段映射到“statusName”参数,并且可以处理如下 URL:

OrderManager/List/New 
OrderManager/List/Viewed 

您可以在此处采用两种基本方法。您可以 1) 创建一个仅处理这两个 URL 的非常具体的路由,或者 2) 您可以尝试创建一个更通用的路由来处理一般情况。我们先来看第一个案例。您可以按如下方式创建路线:

routes.MapRoute("", "OrderManager/List/{statusName}",
              new { Controller = "OrderManager", Action = "List" });

请注意,由于该路由比默认路由更具体,因此必须将此路由放在before默认路由。

如果您想要一个更通用的路由,您需要决定该路由与默认路由有何不同,因为它们都将匹配具有三段的 URL。假设您决定新路由将接受第三段中仅包含字母的任何内容,而让默认路由处理包含数字的任何内容。您可以使用路线约束来做到这一点。例如,您可以编写如下路线:

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            constraints: new { id = @"^\d+$" });

        routes.MapRoute(
            name: "NewRoute",
            url: "{controller}/{action}/{statusName}",
            defaults: new { Controller = "OrderManager", Action = "List" },
            constraints: new { statusName = "^[A-Za-z]+$" });

通过这两个路由,任何第三段中只有字母的三段 URL 都会将第三段放入名为“statusName”的变量中,而任何第三段中包含整数的 URL 会将第三段放入名为“”的变量中。 ID”。

在任何真正复杂的应用程序中,路由可能会变得复杂,为路由编写单元测试非常有利,以确保在添加或修改路由时不会把事情搞砸。

有关路由的良好参考,请参阅斯科特·桑德森的书 https://rads.stackoverflow.com/amzn/click/com/1430234040或查看MSDN 文档 http://msdn.microsoft.com/en-us/library/cc668201(v=vs.100).aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用自定义段变量设置 ASP.Net MVC 4 路由 的相关文章

  • c# .NET MVC 4 - 如何创建使用 Ninject 服务的 Quartz 作业?

    我正在使用 NET MVC 4 所有服务都是使用 Ninject 注入的 我正在尝试使用 Quartz 来安排工作 目前 职位登记在Global asax如下 Global asax protected void Application S
  • 集成测试和单元测试(WEB API mvc 4)

    集成测试和单元测试与 APIController 测试有何关系 在集成测试中创建 Web 请求时如何模拟存储库 以便它不会对数据库进行实际查询 您可以使用自托管 http code msdn microsoft com ASPNET Web
  • MVC 将 PartialViewResult 渲染为字符串

    免责声明 我编辑了问题 因为我改变了过程 但它并没有改变任何问题 我正在尝试获得一个PartialViewResult呈现为字符串 我尝试使用RenderRazorViewToString这个问题的方法将视图渲染为字符串 https sta
  • LINQ to Entities 不支持指定的类型成员“UserName”

    我尝试使用 url 中的 id 参数来显示特定用户的图像 但收到以下错误消息 LINQ to 不支持指定的类型成员 UserName 实体 仅初始值设定项 实体成员和实体导航 支持属性 这是我的操作方法 HttpGet public Act
  • ASP.NET MVC 中的访问控制取决于输入参数/服务层?

    序言 这是一个有点哲学问题 我更多地寻找 正确 的方法来做到这一点 而不是 一种 的方法来做到这一点 假设我有一些产品 以及一个在这些产品上执行 CRUD 的 ASP NET MVC 应用程序 mysite example products
  • 在子网站中使用邮政和 Hangfire

    我一直在尝试在我的 MVC5 站点上使用 Postal 当我将我的网页托管为子网站时 即http localhost 子站点 http localhost Subsite我收到错误 虚拟路径 映射到另一个应用程序 这是不允许的 我已经将其调
  • MVC3 RESTful API 路由和 Http 动词处理

    我想为我的 MVC3 应用程序构建 RESTful Json Api 我需要帮助处理多个 Http Verbs 以操作单个对象实例 我读过 研究过 尝试过的内容 MVC 属性 HttpGet HttpPost等 允许我拥有一个具有多个共享相
  • 布局中的模型破坏了其他页面

    由于缺乏 MVC4 经验 我有一个设计缺陷 问题是我的布局中有一个模型 model BasicFinanceUI Models LoginModel Content Site css rel stylesheet type text css
  • 如何使用 IHttpActionResult 设置标头

    我想将令牌添加到 webapi 请求的标头中 我怎样才能做到这一点 这是我的示例代码 public IHttpActionResult Authenticate Login data var Token fdsf123546fskjhf g
  • 我应该迁移到 ASP.NET MVC 吗?

    我刚刚听了 StackOverflow 团队的第 17 期播客 他们对ASP NET MVC http www asp net mvc 我决定去看看 但首先 我想确定这是值得的 我已经为几天后开始的项目创建了一个基础 Web 应用程序 供其
  • Svelte 路线给我 404

    我在 Svelte 中为我的应用程序创建了一个简单的路由器 如果我从导航栏访问链接 它就可以工作 如果我重新加载页面 它会给我 404 为什么
  • 如何保护 ASP.NET Web API [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想建立一个RESTful使用 ASP NET Web API 的 Web 服务 第三方开发人员将使用该服务来访问我的应用程序的数据
  • ASP.NET MVC - HybridViewResult (ViewResult /PartialViewResult)

    是否可以构建一个依赖于 Ajax 请求或 Http 请求返回的混合 ViewResultPartialViewResult or ViewResult IsAjaxRequest gt 返回 PartialViewResult IsAjax
  • 当前上下文中不存在名称“DefaultAuthenticationTypes”

    我正在尝试在我的 Web 应用程序中实现基于角色的授权 如下所示 HttpPost ActionName Login public ActionResult Login LoginViewModel model if ModelState
  • EF4 和 SQL Server 2000

    我使用 EF4 和 SQL Server 2005 开发了我的网站 但当转移到临时站点时 发现他们使用 SQL Server 2000 现在我收到此错误 我认为该错误与 SQL Server 2000 有关 Incorrect syntax
  • 将 Azure Blob 与 Azure 网站结合使用

    我正在制作一个MVC Windows Azure涉及用户上传图像的网站 我想将图像存储在 blob 中 我搜索了教程 但大多数都涉及Webapps而不是 MVC 网站 我发现的唯一有用的教程是 http www codeproject co
  • 使用 Ajax Jquery post 请求进行 Json 劫持

    昨天 我读了一些关于如何预防的好文章使用 Asp Net MVC 进行 Json 劫持 http haacked com archive 2009 06 24 json hijacking aspx 规则是 永远不要通过 get 请求发送
  • IEnumerable 流式传输

    我想做一些大致相当于下面的代码示例的事情 我想生成并提供数据流 而不必在任何时候将整个数据集都存储在内存中 看来我需要一些接受 Stream 的实现IEnumerable
  • MVC Html.Partial 或 Html.Action

    我是 ASP NET MVC 新手 所以请耐心等待 我需要构建一个在多个视图中重复的菜单 什么可以更好地服务于目的Html Action http msdn microsoft com en us library ee703423 aspx
  • 使用express.js动态加载路线

    我使用express js作为网络服务器 并且想要一种简单的方法来将所有 app get 和 app post 函数分开以分隔文件 例如 如果我想为登录页面指定 get 和 post 函数 我希望在动态加载的路由文件夹中有一个 login

随机推荐