Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从MVC应用程序外部解析url路径_C#_Asp.net Mvc - Fatal编程技术网

C# 如何从MVC应用程序外部解析url路径

C# 如何从MVC应用程序外部解析url路径,c#,asp.net-mvc,C#,Asp.net Mvc,我有一个MVC应用程序,要填充routes表,有如下方法: public static void RegisterRoutes(RouteCollection routes){ routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); .... routes.MapRoute("default", "{controller}/{action}/{id}", new { controller = "Home", action = "in

我有一个MVC应用程序,要填充routes表,有如下方法:

public static void RegisterRoutes(RouteCollection routes){
   routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    ....
   routes.MapRoute("default", "{controller}/{action}/{id}", new { controller = "Home", action = "index", id="" });
   ... etc
}

//and in global.asax it gets called like:
RegisterRoutes(RouteTable.Routes);
现在,如果我从MVC应用程序外部调用该方法(在某些控制台应用程序中,只是为了获取路由),我将传递一个新的空集合,它将填充MVC应用程序中使用的路由,但是它有什么用呢?
我能否仅基于路由集合,识别给定控制器名称、操作和其他参数的url?(同样,从web应用程序的外部)我认为routes[0].GetVirtualPath()是您需要的。但是,您必须将RequestContext和RouteValueDictionary传递给它。如果某个路由无法处理您的输入,它将返回null

我还希望能够从控制台应用程序(sitemap generator)中的路由集合生成URL,并且有太多的路由来进行简单的替换。最后我在UrlHelper.GenerateUrl周围写了一个包装器

public class UrlGenerator
{
    protected string Protocol;
    protected string HostName;
    protected RequestContext RequestContext;
    public RouteCollection RouteCollection;

    public UrlGenerator(string protocol, string hostName, Action<RouteCollection> registerRoutes)
    {
        Protocol = protocol;
        HostName = hostName;
        RouteCollection = new RouteCollection();
        registerRoutes(RouteCollection);
        // Construct a request context with as little as possible
        RequestContext = new RequestContext(new HttpContextWrapper(new HttpContext(new HttpRequest(null, "http://x.com", null), new HttpResponse(null))), new RouteData());
    }

    public string GetUrl(string action, string controller, object routeData)
    {
        return GetUrl(action, controller, new RouteValueDictionary(routeData));
    }
    public string GetUrl(string action, string controller, RouteValueDictionary routeData)
    {
        return UrlHelper.GenerateUrl(null, action, controller, Protocol, HostName, null, routeData, RouteCollection, RequestContext, false);
    }
}

不太清楚你在问什么。您可以访问应用程序外部的任何路由。您是说要将其添加到MVC应用程序的路由表中吗?它引发无效操作异常,并显示HttpContex。Current不能为null。但我没有HttpContext,我是从控制台应用程序调用它的,你可以模拟一下-。然而,如果您只是试图在路由之外查找生成URL,则这是一种过分的做法。一个更好的方法是自己编写替换是的,我已经用这里的解决方案模拟了它
UrlGenerator g = new UrlGenerator("https", "myurl.com", RouteConfig.RegisterRoutes);
Console.WriteLine(g.GetUrl("Index", "Home", new { product = "toad-for-oracle" }));