【问题标题】:routevaluedictionary in actionline in asp.net mvcasp.net mvc中actionline中的routevaluedictionary
【发布时间】:2016-06-29 15:23:51
【问题描述】:

我正在处理我最近得到的这个项目。我发现以下行:

@Html.ActionLink("Application name", "Index", "Home", new { area = "" }, new { @class = "navbar-brand" })

我对以下内容有点困惑:

new { area = "" }

在 msdn 上它说它是 RouteDictionaryValue 但我需要详细信息这是什么意思以及它有什么作用?

【问题讨论】:

  • 如果当前页面在(比如说)Admin 区域,new { area = "" } 将该区域设置为空并生成href="/Home/Index"。没有它,它会生成href="/Admin/Home/Index"
  • 匿名类型(当前类型)将用作RouteDictionaryValue,因为您被要求具有相同的结构:)
  • @StephenMuecke 什么是区域?我听了很多,但在网上找不到任何好的来源?
  • 它只是一种将大型项目组织成逻辑模块的便捷方式。例如,一个学校网站可能有一个供学生查看信息的主模块,以及一个单独的教师区域,教师可以在其中更新详细信息

标签: .net asp.net-mvc asp.net-mvc-4


【解决方案1】:

在这种情况下,

new { area = "" }

anonymous type

匿名类型提供了一种方便的方法,可以将一组只读属性封装到单个对象中,而无需先显式定义类型。类型名称由编译器生成,在源代码级别不可用。每个属性的类型由编译器推断。

基本上,它作为类型对象被ActionLink 接受,该对象在运行时传递给RouteValueDictionary 的构造函数,将其转换为在UrlHelper 类中本机使用的正确类型。

换句话说,你的ActionLink

@Html.ActionLink("Application name", "Index", "Home", 
    new { area = "" }, new { @class = "navbar-brand" })

相当于:

@Html.ActionLink("Application name", "Index", "Home", 
    new RouteValueDictionary() {{ "area", "" }}, 
    new Dictionary<string, object>() {{ "class", "navbar-brand" }})

语法更短。

area 是什么?

渲染视图时,如果ActionLink 中没有提供值,则为route values that are provided in the current request are the defaults

基本上,Microsoft 选择 area = "" 作为默认值,因为如果将参数设置为 null,您将向 MVC 项目添加 Area,并导航到该区域内的操作,链接生成的将是一个名为 Home 的控制器和一个名为 Index 的操作,并且还从当前请求中传入 区域名称

因此,例如,如果您在名为 Admin 的区域中请求 URL,则生成的链接不会转到该站点根目录的主页,它会尝试查找 Index 操作在名为 HomeController 的控制器中Admin 区域内。如果该区域中不存在该操作,您将收到错误消息。生成区域外链接的唯一方法是明确指定它(例如area = ""area = "Foo")。

注意:如果在您的 MVC 应用程序中不使用区域,area = "" 没有任何效果,技术上可以删除。如果不需要将路由值传递给请求,您可以将其设置为 null 或使用没有 routeValues 参数的重载。

【讨论】:

  • 什么是区域?你能补充一些信息吗?
  • 不确定您的意思。但是微软设置了这个默认值,因此您可以添加一个区域,而不会影响您的 URL 在布局视图上的生成方式。如果您需要从区域内生成指向站点非区域部分的链接,则需要将 area = "" 作为路由值传递。
猜你喜欢
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 2016-07-23
  • 1970-01-01
相关资源
最近更新 更多