MVC自定义路由。 DataTokens ["命名空间"]被忽略 [英] MVC Custom Route. DataTokens["Namespaces"] is ignored
问题描述
我不知道在创建为什么 CustomRoute
从路线
继承,现场 DataTokens [命名空间]
被忽略。
和我得到的错误:
的多种类型的发现命名为'家'控制器匹配。这可能发生,如果服务这个请求('{行动} / {ID}')不指定命名空间的路线搜索控制器请求相匹配。如果是这种情况,通过调用'图路线的方法,需要一个命名空间参数的重载寄存器该路由。的
下面是示例:
的Application_Start()
公共静态无效的RegisterRoutes(RouteCollection路线)
{
//创建dataTokens对象
VAR dataTokens =新RouteValueDictionary();
VAR NS =新[] {MvcDomainRouting.Controllers.Delivery};
dataTokens [命名空间] = NS; //注意是一个自定义路线
routes.Add(DomainRoute,新DomainRoute(
域:delivery.md,//域名与参数
网址:{}动作/(编号),// URL带参数
默认:新{控制器=家,行动=索引,ID =} //参数默认
约束:空,
dataTokens:dataTokens,
routeHandler:新MvcRouteHandler()
));
}
DomainRoute.cs
公共类DomainRoute:路线
{
公共字符串域{搞定;组; } 公共DomainRoute(字符串域名,URL字符串,对象默认值,对象的限制,对象dataTokens,IRouteHandler routeHandler)
:基地(网址,新RouteValueDictionary(默认),新RouteValueDictionary(约束),新RouteValueDictionary(dataTokens),routeHandler)
{
域=域名;
} 公众覆盖的RouteData GetRouteData(HttpContextBase的HttpContext)
{
//详细ommited //路由数据
数据的RouteData =新的RouteData(这一点,RouteHandler); 1.新增//默认
// URL 2.Map键/值
//将DataTokens从路线的RouteData复制
如果(DataTokens!= NULL)
{
的foreach(在DataTokens VAR道具)
{
data.DataTokens [prop.Key] = prop.Value;
}
} 返回的数据;
//此时`data`持有DataTokens [命名空间]参见图片
}}
从返回数据堆栈跟踪;
:
HomeController.cs
命名空间MvcDomainRouting.Controllers.Lunch
{
[的HandleError]
公共类HomeController的:控制器
{
公众的ActionResult指数()
{
计算机[消息] =欢迎使用ASP.NET MVC!; 返回查看();
} 公众的ActionResult关于()
{
返回查看();
}
}
}命名空间MvcDomainRouting.Controllers.Delivery
{
[的HandleError]
公共类HomeController的:控制器
{
公众的ActionResult指数()
{
返回的内容(指数嚣交付);
} 公众的ActionResult关于()
{
返回的内容(关于嚣交付);
}
}
}
在此先感谢每个谁是分享经验。
如果有更多的细节需要请询问。的问题是,我创建一个 RouteValueDictionary
的 RouteValueDictionary
。
下面是固定的版本:
这样的:
公共DomainRoute(...,对象dataTokens,...)
:碱(...,dataTokens如RouteValueDictionary,...)
// 代替
//:基地(...,新RouteValueDictionary(dataTokens),..)
{
域=域名;
}
或者这样
// ....
约束:空,
命名空间:新[] {MvcDomainRouting.Controllers.Delivery},
routeHandler:新MvcRouteHandler()
)); 公共DomainRoute(...,字符串[]命名空间,...)
:基地(...,新RouteValueDictionary(){{命名空间,命名空间}},...)
{ }
I don't know why while creating a CustomRoute
which inherits from Route
, the field DataTokens["Namespaces"]
is ignored.
And I get the error: Multiple types were found that match the controller named 'Home'. This can happen if the route that services this request ('{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 'namespaces' parameter. Here is the sample:
Application_Start()
public static void RegisterRoutes(RouteCollection routes)
{
//Create dataTokens object
var dataTokens = new RouteValueDictionary();
var ns = new[] {"MvcDomainRouting.Controllers.Delivery" };
dataTokens["Namespaces"] = ns;
//Note is a custom route
routes.Add("DomainRoute", new DomainRoute(
domain:"delivery.md", // Domain with parameters
url:"{action}/{id}", // URL with parameters
defaults: new { controller = "Home", action = "Index", id = "" },// Parameter defaults
constraints:null,
dataTokens: dataTokens,
routeHandler:new MvcRouteHandler()
));
}
DomainRoute.cs
public class DomainRoute : Route
{
public string Domain { get; set; }
public DomainRoute(string domain, string url, object defaults, object constraints,object dataTokens, IRouteHandler routeHandler)
: base(url, new RouteValueDictionary(defaults), new RouteValueDictionary(constraints), new RouteValueDictionary(dataTokens), routeHandler)
{
Domain = domain;
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
//Details ommited
// Route data
RouteData data = new RouteData(this, RouteHandler);
// 1.Add defaults
// 2.Map URL key/values
// Copy the DataTokens from the Route to the RouteData
if (DataTokens != null)
{
foreach (var prop in DataTokens)
{
data.DataTokens[prop.Key] = prop.Value;
}
}
return data;
// At this point `data` holds the DataTokens["Namespaces"] see picture
}
}
The stack trace from return data;
:
HomeController.cs
namespace MvcDomainRouting.Controllers.Lunch
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
}
namespace MvcDomainRouting.Controllers.Delivery
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
return Content("Index din delivery");
}
public ActionResult About()
{
return Content("About din delivery");
}
}
}
Thanks in advance to each who is sharing experience.
If more details need please ask.The problem was that I was creating a RouteValueDictionary
of RouteValueDictionary
.
Here is the fixed version:
Like this:
public DomainRoute( ...,object dataTokens,...)
: base(...,dataTokens as RouteValueDictionary ,...)
// instead of
// : base(...,new RouteValueDictionary(dataTokens),..)
{
Domain = domain;
}
Or like this
//....
constraints:null,
namespaces: new []{"MvcDomainRouting.Controllers.Delivery" },
routeHandler:new MvcRouteHandler()
));
public DomainRoute( ...,string[] namespaces,...)
: base(...,new RouteValueDictionary(){{"Namespaces",namespaces}} ,...)
{
}
这篇关于MVC自定义路由。 DataTokens ["命名空间"]被忽略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!