【问题标题】:ASP.NET RouteValueDictionary contains Entry with Key "RouteModels"ASP.NET RouteValueDictionary 包含带有键“RouteModels”的条目
【发布时间】:2016-07-23 18:13:35
【问题描述】:

在实现 WebApplication 时,我们在 RouteValueDictionary 中遇到了一个带有“RouteModels”键的可疑条目。

即使 Google 也没有为我提供该条目的结果。 有人可以解释它的来源吗? 它来自自定义路线吗? 或者这是模型绑定绑定的值?

控制器处ActionMethode的声明为:

[Route("User/{user}")]
public ActionResult UserForums(User user, int page = 1)

Request 的 RouteValueDictionary 包含以下条目:

【问题讨论】:

  • 不确定。但我认为RouteModels 键会在您使用Attribute based routing 时添加RouteValueDictionary

标签: c# asp.net asp.net-mvc asp.net-mvc-5 model-binding


【解决方案1】:

是否来自自定义路由?

不清楚。但是,路由值完全取决于自定义路由类的设计方式。

public class SampleRoute : RouteBase
{
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var path = httpContext.Request.Path.Substring(1);
        if (path.Equals("the/virtual/path"))
        {
            var routeData = new RouteData(this, new MvcRouteHandler());

            routeData.Values["user"] = "TheUser";
            routeData.Values["controller"] = "Home";
            routeData.Values["action"] = "Custom";
            routeData.Values["RouteModels"] = new List<RouteModel> { new RouteModel { Name = "Foo" }, new RouteModel { Name = "Bar" } };

            routeData.DataTokens["MetaData"] = "SomeMetadata";

            return routeData;
        }

        return null;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        string user = values["user"] as string;
        string controller = values["controller"] as string;
        string action = values["action"] as string;
        IEnumerable<RouteModel> routeModels = values["RouteModels"] as IEnumerable<RouteModel>;

        if ("TheUser".Equals(user) && "Home".Equals(controller) && "Custom".Equals(action))
        {
            // Use the route models to either complete the match or to do something else.


            return new VirtualPathData(this, "the/virtual/path");
        }

        return null;
    }

    private class RouteModel
    {
        public string Name { get; set; }
    }
}

我的猜测是,这要么是某个专门的路由,要么是 filter,它在路由集合中存储了额外的数据。但是为什么作者选择将其存储为路由值而不是DataTokens(用于元数据)是一个谜。

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多