C# .net路由开始中的可选参数

C# .net路由开始中的可选参数,c#,.net,asp.net-mvc-4,configuration,routes,C#,.net,Asp.net Mvc 4,Configuration,Routes,有 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 我想让我的url允许在开头输入公司名称,例如: url: "{company}/{controller}/{action}/{id}" 所以我可以浏览网页,现在基地是一些公司 do

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
我想让我的url允许在开头输入公司名称,例如:

url: "{company}/{controller}/{action}/{id}"
所以我可以浏览网页,现在基地是一些公司

  • domain.com/company-ltd
  • domain.com/company-ltd/products
  • domain.com/company-ltd/edit
  • domain.com/some-other-company-name-ltd/products
等等


我怎样才能做到这一点?谢谢。

这些路线都是在图案的背面工作的;传入的URL将与模式匹配,直到找到匹配的URL为止

假设您不是在谈论可选的公司名称,那么您应该能够逃脱:

  routes.MapRoute(
        name: "Default With company",
        url: "{company}/{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional
  );
然后简单地确保所有方法都采用
company
参数。但是,对于更简单的路由,这将失败,因此请确保为诸如根目录之类的页面设置默认值。如果您最终想要的是不涉及公司的其他路线,也可以使用管制员特定的路线:

  routes.MapRoute(
        name: "Profile",
        url: "profile/{action}/{id}",
        defaults: new { controller = "Profile", action = "Index", id = UrlParameter.Optional
  );
在不太具体的公司之前

请注意,您可以使用NUnit和MvcContrib.TestHelper在.net中非常轻松地测试这些路由,例如:

"~/company/".WithMethod(HttpVerbs.Get)
            .ShouldMapTo<Controller.HomeController>(x => 
                  x.Index("company"));

"~/company/products/".WithMethod(HttpVerbs.Get)
            .ShouldMapTo<Controller.ProductsController>(x => 
                  x.Index("company"));
“~/company/”.WithMethod(HttpVerbs.Get)
.ShouldMapTo(x=>
x、 指数(“公司”);
“~/company/products/”.WithMethod(HttpVerbs.Get)
.ShouldMapTo(x=>
x、 指数(“公司”);

以确保它们将到达您期望的位置。

不,很抱歉,开始时不能有可选的路线参数。只有路由中的最后一个参数可以是可选的。谢谢,我会试试这个。但是,如果我想为正在使用当前门户且与公司无关的用户提供domain.com/profile,这种方法有效吗?澄清:domain.com/profile-用户可以编辑他的姓名、照片等。。。domain.com/search-用户可以搜索公司。。。domain.com/company-name-ltd/products-用户可以查看特定的公司内容,但在此之前必须定义不同的路由,url为(类似-这取决于您的实际需求)“profile/{action}”和“Profile”的默认控制器。我已经用link对它进行了测试,现在有两个路由:routes.maprote(名称:“default”,url:“{controller}/{action}/{id}”,默认值:new{controller=“Home”,action=“Index”,id=urlparmeter.Optional});MapRoute(名称:“公司名称默认值”,url:{Company}/{controller}/{action}/{id}),默认值:new{controller=“Company”,action=“Index”,id=urlparmeter.Optional});我明白了:资源找不到。顺序很重要。您的URL将通过“默认”路由获取,创建TestController,并在其上调用公司(“索引”)。路由越通用,它应该走得越晚。这样做的想法是,当你在域后面看到用户名时,它就像github中的用户名一样,而不是其他控件/操作。我已经在node.js中完成了这项工作,希望在.net中不会太复杂:)