为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
白衣染霜花 2022-09-04 16:39:53
我想创建一个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 插入到标记中。
查看完整描述

1 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

在视图中,您可以使用 从路由值、操作和控制器生成 URL,并在属性中使用该 URL。若要在 HTML 帮助程序中执行此操作,需要构造自己的 URL 帮助程序。Url.Action()href


// ASP.NET MVC

UrlHelper urlHelper = new UrlHelper(

    helper.ViewContext.RequestContext,

    helper.RouteCollection);


// ASP.NET Core

UrlHelper urlHelper = new UrlHelper(

    new ActionContext(

        helper.ViewContext.HttpContext,

        helper.ViewContext.RouteData,

        helper.ViewContext.ActionDescriptor));

现在,这部分代码:


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.MergeAttribute("href",

    urlHelper.Action(actionName, controllerName, routeValues));

当路径是路由的一部分时,这会正确地将值放在路径中,并将其余值放在查询字符串中。


编辑 - 我提到了标签助手以及它们的可组合性。您的HTML帮助程序正在做很多与图标本身无关的事情,只是为了使其成为一个链接。HTML 帮助程序可以采用呈现委托,但您仍在使用自己的 HTML 帮助程序作为标记。a


这是一个简单的标签帮助程序,它将为您提供一个FontAwesome图标。icon


[HtmlTargetElement("icon", Attributes = "")]

public class IconTagHelper : TagHelper

{

    [HtmlAttributeName("name")]

    public string IconName { get; set; }


    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)

    {

        output.TagName = "span";


        string classAttribute = $@"fa fa-{IconName}";


        output.Attributes.Add("class", classAttribute);

    }

}

现在,您可以将普通标记与 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


查看完整回答
反对 回复 2022-09-04
  • 1 回答
  • 0 关注
  • 63 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信