为什么我的自定义Razor扩展无法正确生成属性?

时间:2014-12-08 15:55:08

标签: razor html-helper

我看到很多问题涉及到这个问题的边缘,但并不完全相同。我在下面编写了简单的HtmlHelper扩展方法,以创建具有<target="_back"属性的固定文本的锚链接,添加到通常的路由和HTML参数中,但结果根本不是我的意思预期

而不是:

<a href="controller/action/id?etc" target="_back">&lt;</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">&lt;</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的结果转换为什么以及为什么它不能完成它显然是为它设计的工作?

1 个答案:

答案 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方法。