Tag: asp.net mvc routing

带有一个必需参数和一个可选参数的ASP.NET MVC路由?

在过去一个月左右的时间里,我一直在研究一个大型MVC应用程序,但这是我第一次需要定义一个自定义路由处理程序,而且我遇到了一些问题。 基本上我有两个参数要通过。 第一个是必需的,第二个是可选的。 我在这里听到这个答案。 这是我的自定义路线: routes.MapRoute( “MyRoute”, “{controller}/{action}/{param1}/{param2}”, new { controller = “MyController”, action = “MyAction”, param1 = “”, param2 = “” // I have also tried “UrlParameter.Optional” here. } ); 我的动作方法签名: public ActionResult MyAction(string param1, string param2) 如果我尝试URL http://[myserver]/MyController/MyAction/Test1/Test2那么它就像我期望的那样工作,param1 =“Test1”和param2 =“Test2” 如果我尝试URL http://[myserver]/MyController/MyAction/Test1那么两个参数都为null。 希望有人可以告诉我这里我做错了什么,因为我迷路了。

从ASP MVC中的区域控制器链接到根控制器

如何从我的某个区域链接到我的一个根控制器? 这给了我一个错误: 路由表中的路由与提供的值不匹配。 我在根控制器集合中的一个名为Admin的文件夹中有一个名为Page控制器。 我可以通过键入\ Admin \ Page来访问此控制器。 这是我注册路线的方式: routes.MapRoute( “Admin”, “Admin/{controller}/{action}/{id}”, new { controller = “Admin”, action = “Index”, id = “” } ); 我希望我可以在我的视图中使用此语法来解决“Admin”路由,但这不起作用。 关于如何修复它的任何想法?

Asp.Net Routing – 显示完整的URL

我有一个域名“http://www.abc.com”。 我在这个域上部署了一个ASP.net MVC4应用程序。 我还在RouteConfig.cs中配置了默认路由,如下所示 routes.MapRoute( name: “Default”, url: “{controller}/{action}/{id}”, defaults: new { controller = “MyApp”, action = “Home”, id = UrlParameter.Optional } ); 以上映射确保任何试图访问“http://www.abc.com”的人自动显示“http://www.abc.com/MyApp/Home”页面 一切都按预期工作,但浏览器中的地址栏显示“http://www.abc.com”而不是“http://www.abc.com/MyApp/Home”。 有没有办法强制浏览器显示完整的URL,包括控制器和动作?

ASP.NET Web API获取子列表(分层资源)

我有以下rest架构,我想使用ASP.NET Web Api实现: http://mydomain/api/students http://mydomain/api/students/s123 http://mydomain/api/students/s123/classes http://mydomain/api/students/s123/classes/c456 我使用ApiController和以下两种方法使前两个链接正常工作: public class StudentsController : ApiController { // GET api/students public IEnumerable GetStudents() { } // GET api/students/5 public IEnumerable GetStudent(string id) { } } 在同一个控制器中,(或者我需要一个名为ClassesController的不同控制器?),我如何实现最后两个链接? 另外,“类”部分的路由是什么样的(如果需要)? 这是我的WebApiConfig(我想保持动态,而不是硬编码到/ classes的路径,如果可能的话: config.Routes.MapHttpRoute( name: “DefaultApi”, routeTemplate: “api/{controller}/{id}”, defaults: new { id = RouteParameter.Optional } ); // EDIT – I’m getting 404’s […]

发现多个类型与名为“Home”的控制器相匹配 – 在两个不同的区域中

我的项目有两个方面。 现在,当我运行程序时,我收到此错误: Multiple types were found that match the controller named ‘Home’. This can happen if the route that services this request (‘{controller}/{action}/{id}’) does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the ‘MapRoute’ method that takes a […]

MVC重定向到默认路由

这是我的默认路线: routes.MapRouteLowercase( “Default”, “{country}/{controller}/{action}/{id}”, new { country = “uk”, controller = “Home”, action = “Index”, id = UrlParameter.Optional }, new[] { “Presentation.Controllers” } ); 众所周知,当有人访问www.domain.com/时,MVC的路由将根据上述路由确定默认控制器和要执行的操作,但URL将保持不变。 对于使用默认值的每条路线,是否有内置或优雅的方式从www.domain.com/执行301重定向到www.domain.com/uk/{controller}/{action}/?

具有任意深度的ASP.NET MVC动态路由和动作链接

我想用ASP.NET MVC组建一个论坛/留言板。 在这些类型的论坛上很常见的是分层板类别,例如: -一般讨论;一般交流 -技术支援 – 网站技术支持 – 产品技术支持 —产品A技术支持 —产品B技术支持 然后,每个类别下面的主题和消息属于这些主题。 我主要关注的是1.)到达正确的位置,给定URL,2。)不包括​​我的URL中的大量不必要的信息,以及3.)能够从代码重新创建URL。 我想要一个像这样的URL: mysite.com/Forum/ – 论坛索引 mysite.com/Forum/General-Discussion/ – “一般性讨论”的董事会索引 mysite.com/Forum/Technical-Support/Product/Product-A/ – “产品A技术支持”的主板索引 mysite.com/Forum/Technical-Support/Website/Topic1004/ – “网站技术支持”主板中ID为1004的主题主题索引 mysite.com/Forum/Technical-Support/Website/Topic1004/3 – 主题ID为1004的第3页 现在,我已经从中排除了动作名称,因为它们可以根据我的位置来推断。 我的数据库中的每个Board实体都有一个“UrlPart”列,该列已编制索引,因此我希望能够对该表执行相对快速的查询以确定我的位置。 问题是:为了找出正确的位置,我应该使用自定义路由处理程序,自定义路由绑定器,还是应该创建模糊的路由规则? 这个建议看起来相当不错,但它看起来似乎很多工作没有什么好处: ASP.NET MVC自定义路由搜索 这似乎表明创建模型绑定会更容易: MVC Dynamic Routes 为了实现#3,我将不得不创建自己的自定义URL生成逻辑,对吧?

为什么CSS和JS文件会绕过Asp.Net MVC路由?

我收到了一个用Asp.Net MVC4构建的原型应用程序。 它目前正在使用NInject,ServiceLocator等全部替换默认控制器工厂。 问题是,通过替换默认控制器工厂,对JS文件的请求被视为对控制器和操作的合法请求。 因此,查看Visual Studio创建的默认模板,路由配置如下所示: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”); routes.MapRoute( name: “Default”, url: “{controller}/{action}/{id}”, defaults: new { controller = “Home”, action = “Index”, id = UrlParameter.Optional } ); } 看了之后,我问自己:为什么“/Scripts/jquery.js”的请求不会被Asp.Net MVC解释? 我的意思是,为什么它不认为“脚本”是一个控制器而“jquery.js”是一个动作? 因为如果禁用控制器工厂覆盖,项目可以工作,我只能假设默认工厂负责这种检查。 这意味着“/ Scripts/jquery.js”确实传递给控制器​​工厂,这是我真正不知道的事情。 谁能对此有所了解? 当覆盖控制器工厂以避免此类问题时,应该采取什么样的处理?

生成链接时如何忽略当前路由值?

这个问题类似于asp.net mvc Html.ActionLink(),它保留了我不想要的路由值 ,但有一个扭曲使得它更复杂。 从默认的新MVC3应用程序开始,我将路由更改为: routes.MapRoute( “r1”, // Route name “{controller}/{id}/{action}” ); routes.MapRoute( “r2”, // Route name “{controller}/{action}” ); 请注意,id位于第一个操作之前。 然后在Home \ Index.cshtml中,我添加: @Url.Action(“Index”) @Url.Action(“Index”, new { id = “blah” }) @Url.Action(“Index”, new { id = “” }) 现在我导航到/ Home / Foo / Index并查看3个生成的链接。 我明白了 “/首页/美孚/索引” “/首页/胡说/索引” “/首页/指数?ID =富” 前两个是有道理的,并且正在使用第一条路线。 但是在第三个链接中,遇到第二个路径,我不明白为什么id = Foo在查询字符串上传递,因为我明确地传递了一个空id。 我希望它只是生成“/ Home […]

ASP.NET MVC:在不影响性能的情况下路由自定义slug

我想在我的CMS中为页面创建自定义slug,因此用户可以创建自己的SEO-urls(如Wordpress)。 我以前通过“滥用”404路由在Ruby on Rails和PHP框架中执行此操作。 无法找到请求的控制器时调用此路由,使我能够将用户路由到我的动态页面控制器以解析slug(如果没有找到页面,我将其重定向到真正的404)。 这样,仅查询数据库以检查所请求的段塞。 但是,在MVC中,只有当路由不符合/{controller}/{action}/{id}的默认路由时,才会调用catch-all路由。 为了仍然能够解析自定义slugs我修改了RouteConfig.cs文件: public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”); routes.MapHttpRoute( name: “DefaultApi”, routeTemplate: “api/{controller}/{id}”, defaults: new { id = RouteParameter.Optional } ); RegisterCustomRoutes(routes); routes.MapRoute( name: “Default”, url: “{controller}/{action}/{id}”, defaults: new { Controller = “Pages”, Action = “Index”, id = UrlParameter.Optional } ); } public static […]