MVC5中能否为Html.ActionLink指定服务器名及使用HTML Helper?
当然可以!默认情况下Html.ActionLink生成的是相对URL,但它有一个专门的重载允许你指定完整的协议和服务器(主机)名称。这个重载的参数顺序是:链接显示文本、Action名称、Controller名称、协议(http/https)、主机名、URL片段(锚点)、路由参数、HTML属性。
举个实际的例子,如果你想生成指向https://myotherserver.com/Home/Details的链接,代码可以这么写:
@Html.ActionLink( "查看详情", // 链接显示文本 "Details", // Action名称 "Home", // Controller名称 "https", // 协议类型 "myotherserver.com",// 目标服务器/主机名称 null, // URL片段(比如#top这类锚点) new { id = 123 }, // 路由参数 null // 链接的HTML属性 )
生成的最终HTML会是:
<a href="https://myotherserver.com/Home/Details/123">查看详情</a>
这个重载完美解决了指定服务器名称的需求,只要你明确目标服务器的地址就行。
首先得明确一个核心点:如果是跨不同的独立Web项目(不在同一个路由系统里),默认的ActionLink没法直接依赖目标项目的路由配置——因为ActionLink是基于当前应用的路由表生成URL的,它不知道另一个项目的路由规则。
不过有几种变通方案可以实现类似需求:
用带主机参数的
ActionLink重载:如果目标项目的路由结构和当前项目一致(比如同样的Controller/Action命名规则),你可以用问题1里提到的重载,直接指定目标项目的服务器地址。比如:@Html.ActionLink( "跳转到另一个项目的仪表盘", "Index", "Dashboard", "https", "otherproject.mydomain.com", null, null, null )这种方式的前提是你确定目标项目存在
Dashboard/Index这个路由,否则生成的URL会无效。手动构造绝对URL:如果目标项目的路由结构和当前差异很大,直接结合配置的基础URL来生成会更可靠。比如先把目标项目的基础地址存在Web.config里:
<appSettings> <add key="OtherProjectBaseUrl" value="https://otherproject.mydomain.com" /> </appSettings>然后在视图里构造链接:
<a href="@($"{System.Configuration.ConfigurationManager.AppSettings["OtherProjectBaseUrl"]}/Reports/Monthly")">查看月度报告</a>如果你想坚持用HTML Helper,也可以用
Url.Content配合基础URL,但本质还是构造绝对路径。区分同一个应用的Area和跨项目:如果只是同一个应用内的不同Area,直接在
RouteValues里指定area参数就可以,这是ActionLink原生支持的场景:@Html.ActionLink("后台管理", "Index", "Home", new { area = "Admin" }, null)这和跨项目是完全不同的概念,不要混淆。
总结一下:跨项目的话,ActionLink可以用,但需要匹配目标项目的路由结构;如果路由不兼容,直接用锚标签或者构造绝对URL会更灵活。
内容的提问来源于stack exchange,提问作者RandomHandle

