如何在 .net Core 2.2 中正确创建锚点助手

我想创建一个HtmlHelper来显示带有具体化框架图标的链接。


我写这段代码是因为我找不到类似的例子。我的代码可以工作,但至少看起来很糟糕。我想我应该使用UrlHelper和UrlAction,但我不知道该怎么做。


public static IHtmlContent IconActionLink(this IHtmlHelper helper,

    string iconName,

    object iconHtmlAttributes,

    string linkText,

    string actionName,

    string controllerName,

    object routeValues,

    object linkHtmlAttributes)

{

    var content = new HtmlContentBuilder();

    var anchorStart = new TagBuilder("a");


    string routeValuesToString = "?";

    foreach(var r in new RouteValueDictionary(routeValues))

    {

        routeValuesToString += r.Key.ToString()+"="+r.Value.ToString()+"&";

    }

    routeValuesToString.Remove(routeValuesToString.Length-1);


    anchorStart.MergeAttribute("href", "../"+controllerName+"/"+actionName+"/"

        + routeValuesToString);


    anchorStart.MergeAttributes(new RouteValueDictionary(linkHtmlAttributes));

    anchorStart.InnerHtml.Append(linkText);

    anchorStart.TagRenderMode = TagRenderMode.StartTag;


    var icon = MaterialIcon(helper, iconName, iconHtmlAttributes);


    var anchorEnd = new TagBuilder("a") { TagRenderMode = TagRenderMode.EndTag };


    content.AppendHtml(anchorStart);

    content.AppendHtml(icon);

    content.AppendHtml(anchorEnd);


    return content;

}

我想知道如何正确地将 RouteValues、Action、Controller 插入到标记中。


白衣染霜花
浏览 65回答 1
1回答

幕布斯7119047

在视图中,您可以使用 从路由值、操作和控制器生成 URL,并在属性中使用该 URL。若要在 HTML 帮助程序中执行此操作,需要构造自己的 URL 帮助程序。Url.Action()href// ASP.NET MVCUrlHelper urlHelper = new UrlHelper(&nbsp; &nbsp; helper.ViewContext.RequestContext,&nbsp; &nbsp; helper.RouteCollection);// ASP.NET CoreUrlHelper urlHelper = new UrlHelper(&nbsp; &nbsp; new ActionContext(&nbsp; &nbsp; &nbsp; &nbsp; helper.ViewContext.HttpContext,&nbsp; &nbsp; &nbsp; &nbsp; helper.ViewContext.RouteData,&nbsp; &nbsp; &nbsp; &nbsp; helper.ViewContext.ActionDescriptor));现在,这部分代码:string routeValuesToString = "?";foreach(var r in new RouteValueDictionary(routeValues)){&nbsp; &nbsp; routeValuesToString += r.Key.ToString()+"="+r.Value.ToString()+"&";}routeValuesToString.Remove(routeValuesToString.Length-1);anchorStart.MergeAttribute("href", "../"+controllerName+"/"+actionName+"/"&nbsp; &nbsp; + routeValuesToString);可以简化为:anchorStart.MergeAttribute("href",&nbsp; &nbsp; urlHelper.Action(actionName, controllerName, routeValues));当路径是路由的一部分时,这会正确地将值放在路径中,并将其余值放在查询字符串中。编辑 - 我提到了标签助手以及它们的可组合性。您的HTML帮助程序正在做很多与图标本身无关的事情,只是为了使其成为一个链接。HTML 帮助程序可以采用呈现委托,但您仍在使用自己的 HTML 帮助程序作为标记。a这是一个简单的标签帮助程序,它将为您提供一个FontAwesome图标。icon[HtmlTargetElement("icon", Attributes = "")]public class IconTagHelper : TagHelper{&nbsp; &nbsp; [HtmlAttributeName("name")]&nbsp; &nbsp; public string IconName { get; set; }&nbsp; &nbsp; public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; output.TagName = "span";&nbsp; &nbsp; &nbsp; &nbsp; string classAttribute = $@"fa fa-{IconName}";&nbsp; &nbsp; &nbsp; &nbsp; output.Attributes.Add("class", classAttribute);&nbsp; &nbsp; }}现在,您可以将普通标记与 asp-* 标记帮助程序属性结合使用,并向标记添加任何其他属性(如 data-id)。aicon<a asp-action="someAction" asp-controller="theController" asp-route-id="@Model.Id"><icon name="fa-thumbs-up" data-id="@Model.Id" /></a>使用 ,它将呈现如下内容:Model.Id == 1<a href="/theController/someAction/1"><span class="fa fa-thumbs-up" data-id="1"></span></a>换句话说,标记帮助程序唯一关心的是如何将原始参数转换为表示图标的标记。其他所有内容(锚点标签构造、其他属性等)都可以留给更适合这些任务的其他内容。这是一个美丽的关注点分离。iconName为此,您可能需要重构方法,甚至将该代码引入标记帮助程序,具体取决于它的作用。MaterialIcon
打开App,查看更多内容
随时随地看视频慕课网APP