ActionLink、Html.BeginForm、Url.Content 如何匹配正确的路由
本文关键字:路由 何匹配 Content Html BeginForm Url ActionLink | 更新日期: 2023-09-27 18:32:29
有人可以向我解释一下,ActionLink(通常是 Html 助手(从哪里获得正确的路由,以及它如何创建正确的路径。例如:
对于这样的路线
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
操作链接如下所示:
@Html.ActionLink("MyCoolLink","About","Home")
生成的 HTML 如下所示:
<a href="/Home/About">About</a>
如何为同一路由定义自定义href
路径,假设一个看起来像这样的路径:
href="/About"
or
href="Home.myDomain.com/About"
谢谢!
Url.Content
: 在内部,当您使用 Url.Content
时会使用 VirtualPathUtility
。
而且,Html.ActionLink
(以及Url.RouteUrl
(使用RouteCollection.GetVirtualPath
方法。该ActionLink
实际上是特定于MVC(动作和控制器参数(的,Url.RouteUrl
更通用。
Microsoft确实已经将ActionLink
方法构建为扩展方法。如果这些扩展仍然不能满足您的目的,我们鼓励您编写自己的扩展。
从here
下载源代码,了解Microsoft如何实现这些扩展。
此外,让我们以创建自定义HtmlHelper
方法的示例示例结束。在创建自定义HtmlHelper
方法时,最好阅读下面的命名空间/类。
System.Web.Mvc.Html Namespace
System.Web.Mvc.TagBuilder Class
System.Web.Mvc.ModelMetaData Class
System.Web.Mvc.ExpressionHelper Class
System.Linq.Expressions.Expression<TDelegate> Class
以下示例显示了如何在HTML.ActionLink
中创建自定义<span>
标记
<a href="[action-link]"><span>[action-link text]</span></a>
要开始此操作,请创建一个名为 HtmlExtensions
的静态类。让我们创建一个名为 ActionLinkWithSpan
的扩展方法,该方法将扩展HtmlHelper
类。
namespace Tutorial.Examples
{
using System;
using System.Linq.Expressions;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Web.Routing;
public static class HtmlExtensions
{
public static MvcHtmlString ActionLinkWithSpan(this HtmlHelper html,
string linkText,
string actionName,
string controllerName,
object htmlAttributes)
{
RouteValueDictionary attributes = new RouteValueDictionary(htmlAttributes);
TagBuilder linkTag = new TagBuilder("a");
TagBuilder spanTag = new TagBuilder("span");
spanTag.SetInnerText(linkText);
// Merge Attributes on the Tag you wish the htmlAttributes to be rendered on.
// e.g. linkTag.MergeAttributes(attributes);
spanTag.MergeAttributes(attributes);
UrlHelper url = new UrlHelper(html.ViewContext.RequestContext);
linkTag.Attributes.Add("href", url.Action(actionName, controllerName));
linkTag.InnerHtml = spanTag.ToString(TagRenderMode.Normal);
return MvcHtmlString.Create(linkTag.ToString(TagRenderMode.Normal));
}
}
}
建议使用此链接来详细了解如何创建自定义 MVC 方法。
ActionLink 将使用默认或第一个匹配路由生成方法的虚拟路径。因此,您有以下选择
1 在Global.asax
中以更高的优先级(即在其他路由定义之前(将条目添加到RegisterRoutes
:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"CustomRoute", // Route name
"Something/{controller}/{action}"
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
在这种情况下,CustomRoute
将应用于所有匹配的路由,因此这是非常全局的变化。
2 添加优先级较低的CustomRoute
(即在其他路由之后(并在视图中定位它:
@Html.RouteLink("MyLink", "CustomRoute", new { controller = "Home", action = "Index" });
3 将您自己的扩展方法编写到 HtmlHelper 以提供所需的功能。使用以下代码在解决方案中添加一个新文件:
namespace System.Web.Mvc {
{
public static class HtmlHelperExtensions
{
public static MvcHtmlString CustomActionLink(this HtmlHelper htmlHelper, tring linkText, string actionName, string controllerName)
{
return new MvcHtmlString(String.Format("<a href='http://myUrl.com/{0}/{1}'>{2}</a>", controllerName, actionName, linkText));
}
}
}
用法:
@Html.CustomActionLink("LinkText", "Action", "Controller")
4 不要使用操作链接帮助程序的方法,只需在视图中写入您的 URL。