Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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
Asp.net mvc 如何控制ASP.NET MVC中使用的操作_Asp.net Mvc_Asp.net Mvc Routing - Fatal编程技术网

Asp.net mvc 如何控制ASP.NET MVC中使用的操作

Asp.net mvc 如何控制ASP.NET MVC中使用的操作,asp.net-mvc,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc Routing,我有一个设置,其中我使用一个路由,url的格式如下: www.example.com/friendly-url-1 www.example.com/friendly-url-2 www.example.com/other-friendly-url 路线定义如下: routes.MapRoute("FriendlyUrl", "{name}", new { controller = "FriendlyUrl", action = "Index", name = UrlPa

我有一个设置,其中我使用一个路由,url的格式如下:

www.example.com/friendly-url-1

www.example.com/friendly-url-2

www.example.com/other-friendly-url

路线定义如下:

routes.MapRoute("FriendlyUrl", "{name}",
             new { controller = "FriendlyUrl", action = "Index", name = UrlParameter.Optional }
         );    
Name是我的应用程序中的一个内部属性,它允许我查找自定义ControllerFactory中应使用的控制器,并更改所创建控制器的名称(没有名为FriendlyUrl的实际控制器)


如果每个控制器只有一个操作,那么它工作得很好,但是因为操作不是路由的一部分,所以它总是使用默认操作。我希望有多个操作,但我无法找到一个好方法来编写逻辑,控制每个请求应该使用哪个操作。有可能吗?

您可以为您的URL编写专用路由,在这种情况下,它将调用不同的操作。但是如果你想使用一个表达式来路由到不同的动作,我不认为你可以直接通过在routeConfig中写入route来实现,因为你需要在某个地方指定URL段到动作的映射,这相当于在routeConfig中创建专用的路由“www.example.com/friendly url/name”并希望
name
确定控制器和操作,例如

  • “example.com/friendly/foo”将解析为
    SomeController
    XxxAction
  • “example.com/friendly/boo”将解析为另一个控制器
我认为,最简单的方法是使用自定义路由处理程序

public class MyRouteHander : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var values = requestContext.RouteData.Values;
        var token = GetRequestToken(requestContext); 
        switch (token) {
           case "friendly/foo") {
            values["controller"] = "some";
            values["action"] = "xxx";
            break;
           case "friendly/boo") {
            values["controller"] = "another";
            values["action"] = "zzz";
            break;
           ...
        }
        return new MvcHandler(requestContext);
    }
}
然后将处理程序注册到

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
).RouteHandler = new MyRouteHander();

您必须在URL中指定要调用的操作。它将始终调用默认操作是有意义的,因为在您的路由中没有其他信息可用于调用特定操作。只有一个URL段:名称。这是我的系统中的一个值,使我能够找到正确的控制器和操作。我无法为每个页面(名称)创建单独的路由,因为一个站点可以包含数百万个页面。在同一侧,每种类型的url也将调用相同的操作