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