Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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# 使用带有区域的RouteLink_C#_Asp.net Mvc_Asp.net Mvc 3_Asp.net Mvc Routing_Asp.net Mvc Areas - Fatal编程技术网

C# 使用带有区域的RouteLink

C# 使用带有区域的RouteLink,c#,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-routing,asp.net-mvc-areas,C#,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc Routing,Asp.net Mvc Areas,在我的MVC应用程序中,我定义了一个默认路由: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new []{ "Demo.Controllers" } ); 我创建了一个名

在我的MVC应用程序中,我定义了一个默认路由:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new []{ "Demo.Controllers" }
);
我创建了一个名为Admin的新区域,并在AdminAreaRegistration类中为添加了一个路由:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "Admin_default",
        "Admin/{controller}/{action}/{id}",
        new { action = "Index", controller = "Home", id = UrlParameter.Optional }
    );
} 
在我的主布局文件中,我尝试执行以下操作:

@Html.RouteLink("Admin", "Admin_default")
它只在某些情况下有效(例如,如果我已经在管理页面中)。如果我在我的站点的/Home/About部分,则会生成如下URL:

/Admin/Home/About
/Admin
如果我在主控制器的索引操作中(在主区域中,而不是在管理中),则URL会像这样生成:

/Admin/Home/About
/Admin
为什么RouteLink不能像我认为的那样使用MVC中的区域工作?

@Html.RouteLink(“Admin”、“Admin\u default”)
此路由使用名为
Admin\u default
的路由,因此它将始终使用该路由生成url

@Html.RouteLink(“Admin”、“Admin\u default”、new{controller=“Home”、action=“Index”})

当您不指定诸如路由值之类的内容时,大多数MVC都使用当前存在的值。在这种情况下,由于
操作
控制器
值为空,它会查看
路由值
并检查它们是否在那里,如果找到,则使用在那里找到的值

这有时是有帮助的。例如,如果希望使用页面上使用的相同值填充
{id}

Url:
/home/edit/1701


@Html.RouteLink(“刷新”、“默认值”)
将产生相同的url-如果需要,可以指定覆盖。

不建议命名路由,因为它会在视图中创建对现有路由的依赖关系。我建议使用空值

我还建议不要命名路由。您可以通过在创建路由名称arg时将null传递给路由名称arg来强制自己执行此操作

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(null,
        "Admin/{controller}/{action}/{id}",
        new { action = "Index", controller = "Home", id = UrlParameter.Optional }
    );
}
然后,您可以像这样使用RouteLink:

@Html.RouteLink("Admin", 
    new { controller = "Home", action = "Index", area = "Admin" })
回复评论


但愿我能说是我想出了这个主意。这是从Steve Sanderson的MVC书中学到的。有大量方法重载将路由名称作为参数(RouteLink,但也包括RedirectToRoute和其他)。不使用路由名称会迫使您使用这些方法的其他重载,IMO更直观,更容易“正确”

我希望URL是
/Admin
。我的管理员默认路由的默认值是:controller=“Home”、action=“Index”。为什么它会使用About作为我的操作?啊,在这种情况下,它使用的是请求更新应答中的现有路由值,那么为什么它使用页面中的当前路由值呢?这对我来说似乎很奇怪。我不知道你能做到这一点……我想,因为路线名称必须是唯一的,所以它们是必需的。Mind=blown依赖路由名称生成传出URL的问题在于,这样做打破了MVC设计模式中至关重要的关注点分离。在视图或操作方法中生成链接或URL时,我们希望关注用户将被定向到的操作和控制器,而不是将要使用的URL格式。通过将不同路由的知识引入视图或控制器,我们创建了我们希望避免的依赖关系。(指定null作为名称并在代码中使用注释)(Apress Pro ASP.NET MVC3)