我看到很多问题涉及到这个问题的边缘,但并不完全相同。我在下面编写了简单的HtmlHelper扩展方法,以创建具有<
和target="_back"
属性的固定文本的锚链接,添加到通常的路由和HTML参数中,但结果根本不是我的意思预期
而不是:
<a href="controller/action/id?etc" target="_back"><</a>
我明白了:
<a Count="1" Keys="System.Collections.Generic.Dictionary`2+KeyCollection[System.String,System.Object]" Values="System.Collections.Generic.Dictionary`2+ValueCollection[System.String,System.Object]" href="controller/action/id?etc"><</a>"
这是我的HtmlHelper扩展方法:
public static MvcHtmlString BackLink(this HtmlHelper htmlHelper, string actionName, string controller = null, object routeValuesObject = null, object htmlAttributes = null)
{
RouteValueDictionary rvd = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
rvd.Add("target", "_back");
return htmlHelper.ActionLink("<", actionName, controller, routeValuesObject, rvd);
}
之前我曾使用类似的电话,但没有看到这种情况发生。我应该将AnonymousObjectToHtmlAttributes
的结果转换为什么以及为什么它不能完成它显然是为它设计的工作?
答案 0 :(得分:0)
同样,编译器太聪明了,因为它本身的好处:)
htmlHelper.ActionLink
有两个类似的重载:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName,
object routeValues, object htmlAttributes);
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName,
RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes);
我遇到的问题是它决定使用第一个object, object
变体,因为路径值没有像HTML属性那样转换。
因此,解决方案是将路线值转换为RouteValueDictionary
:
public static MvcHtmlString BackLink(this HtmlHelper htmlHelper, string actionName, string controller = null, object routeValuesObject = null, object htmlAttributes = null)
{
RouteValueDictionary routeValues = new RouteValueDictionary(routeValuesObject);
RouteValueDictionary htmlAttr = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
htmlAttr.Add("target", "_back");
return htmlHelper.ActionLink("<", actionName, controller, routeValues, htmlAttr);
}
这会导致它使用RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes
方法。