MVC自定义路由。 DataTokens ["命名空间"]被忽略 [英] MVC Custom Route. DataTokens["Namespaces"] is ignored

查看:952
本文介绍了MVC自定义路由。 DataTokens ["命名空间"]被忽略的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不知道在创建为什么 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆