ActionLink,Html.BeginForm,Url.Content如何匹配正确的路线

时间:2013-09-22 12:52:21

标签: c# asp.net asp.net-mvc-3 asp.net-mvc-routing url-routing

有人可以向我解释一下,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"

谢谢!

2 个答案:

答案 0 :(得分:3)

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

以下示例显示如何在<span>

中创建/添加自定义HTML.ActionLink代码
<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));
}
}
}
建议

This link 更多地了解创建自定义MVC方法。

答案 1 :(得分:2)

ActionLink将使用默认路径或第一个匹配路由生成方法的虚拟路径。所以,你有以下选择

1以更高的优先级(即在其他路线定义之前)向RegisterRoutes的{​​{1}}添加条目:

Global.asax

在这种情况下, 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 } ); } 将应用于所有匹配的路由,因此这是全局变化。

2添加具有较低优先级的CustomRoute(即在其他路线之后)并将其作为目标:

CustomRoute

3将您自己的扩展方法编写到HtmlHelper以提供所需的功能。使用以下代码在解决方案中添加新文件:

@Html.RouteLink("MyLink", "CustomRoute", new { controller = "Home", action = "Index" });

用法:

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));
        }
    }
}

4不要使用ActionLink助手的方法,只需在视图中写下您的URL。