1 回答
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
- 1 回答
- 0 关注
- 63 浏览
添加回答
举报