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"

谢谢!

ActionLink、Html.BeginForm、Url.Content 如何匹配正确的路由

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。