4

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

谢谢!

4

2 回答 2

3

Url.Content: 在内部,VirtualPathUtility当你使用Url.Content.

并且,Html.ActionLink(以及Url.RouteUrl),使用RouteCollection.GetVirtualPath方法。这ActionLink实际上是特定于 MVC(动作和控制器参数)并且Url.RouteUrl更通用。

微软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.Lets 的静态类,创建一个名为扩展类的扩展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 方法的信息。

于 2013-09-23T05:39:30.423 回答
2

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

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

在这种情况下CustomRoute将应用于所有匹配的路由,所以这是一个相当全局的变化。

2CustomRoute以较低的优先级添加(即在其他路由之后)并在视图中定位它:

@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 不要使用 ActionLink helper 的方法,只需在视图中写入您的 URL。

于 2013-09-22T13:39:27.610 回答