c# – Html.ActionLink扩展

我正在尝试扩展
Html.ActionLink,因为我想为共享组件添加自定义元数据(在本例中为模态).

我的目标是进一步扩展.Net MVC中的LinkExtensions类,它将为html类属性添加一个值并添加一个自定义数据属性,从而产生以下结果:

<a href="/Controller/Action/id" class="show-in-modal style1 style2" data-title="Modal title">Link</a>

帮助器看起来类似于MVC方法:

public static MvcHtmlString ModalLink(this HtmlHelper htmlHelper, string title, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
{
    // Add 'show-in-modal' class here
    // Add 'data-title' attribute here

    return htmlHelper.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes);
}

@Html.ModalLink("Modal title", "Link", "action", "controller", new { id = "id" }, new { @class = "style1 style2" });

我遇到的这个问题是我无法轻易修改htmlAttributes对象来添加我的类名和数据属性,这是有意义的,因为这是一个只读的匿名对象.

有没有办法我可以轻松地应用所需的值/元数据,而不必用反射将所有东西分开并重新组合在一起?

我注意到MVC有重载,它以IDictionary< string,object>的形式接受html属性,是否有一个将匿名类型转换为可修改字典的扩展方法?

我在搜索范围内的是如何使用Html.ActionLink()方法.

最佳答案 您正在寻找的功能是:

HtmlHelper.AnonymousObjectToHtmlAttributes()

https://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper.anonymousobjecttohtmlattributes(v=vs.118).aspx

以下是ModalLink扩展的一个版本:

public static MvcHtmlString ModalLink(this HtmlHelper htmlHelper, string title, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
{
  // Add 'show-in-modal' class here
  // Add 'data-title' attribute here

  var htmlAttr = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

  const string classKey = "class";
  const string titleKey = "data-title";

  const string classToAdd = "show-in-modal";
  if (htmlAttr.ContainsKey(classKey) == true)
  {
    htmlAttr[classKey] += " " + classToAdd;
  }
  else
  {
    htmlAttr.Add(classKey, classToAdd);
  }

  if (htmlAttr.ContainsKey(titleKey) == true)
  {
    htmlAttr[titleKey] = title;
  }
  else
  {
    htmlAttr.Add(titleKey, title);
  }

  return htmlHelper.ActionLink(linkText, actionName, controllerName, new RouteValueDictionary(routeValues), htmlAttr);
}
点赞