所以就这样:

我有一个HTML帮助器,它使用当前URL的可选参数来呈现ActionLink。此html帮助器还允许您根据需要添加一些其他可选参数,并将它们合并到1 RouteValueDictionary中。

    public static string ActionLinkwParams(this HtmlHelper helper, string linktext, string action, string controller, object extraRVs, object htmlAttributes) {

        //get current optional params from current URL
        NameValueCollection c = helper.ViewContext.RequestContext.HttpContext.Request.QueryString;

        //put those in a dict
        RouteValueDictionary r = new RouteValueDictionary();
        foreach (string s in c.AllKeys) {
            r.Add(s, c[s]);
        }

        RouteValueDictionary htmlAtts = new RouteValueDictionary(htmlAttributes);

        RouteValueDictionary extra = new RouteValueDictionary(extraRVs);

        //merge them
        RouteValueDictionary m = RouteValues.MergeRouteValues(r, extra);

        return helper.ActionLink(linktext, action, controller, m, htmlAtts).ToHtmlString();
    }


这很完美,但是我现在添加了SecurityAware Actionlinks。

所以

        return helper.ActionLink(linktext, action, controller, m, htmlAtts).ToHtmlString();


变成

        return helper.SecurityTrimmedActionLink(linktext, action, controller, m, htmlAtts);


然后调用:

   public static string SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string action, string controller, object extraRVs, object htmlAttributes) {
        return SecurityTrimmedActionLink(htmlHelper, linkText, action, controller, extraRVs, htmlAttributes, false);
    }

    public static string SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string action, string controller, object extraRVs, object htmlAttributes, bool showDisabled) {
        if (controller == null) {
            RouteData routeData = htmlHelper.ViewContext.RouteData;
            controller = routeData.GetRequiredString("controller");
        }
        if (IsAccessibleToUser(action, controller)) {
            return htmlHelper.ActionLink(linkText, action, controller, extraRVs, htmlAttributes).ToHtmlString();
        } else {
            return showDisabled ? String.Format("<span>{0}</span>", linkText) : "";
        }
    }


现在这不起作用。它可以编译,但是我的URL看起来不太好。

   <a count="3" keys="System.Collections.Generic.Dictionary`2+KeyCollection[System.String,System.Object]" values="System.Collections.Generic.Dictionary`2+ValueCollection[System.String,System.Object]" href="/2011-2012/Instelling?Count=3&amp;Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&amp;Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D">Back to List</a>


如您所见,以前做过的工作现在没有了,因为它将RouteValueDictionary作为对象,这给了我我想要的结果。

所以我想,如果我再次让它们RouteValueDictionary怎么办。

       if (IsAccessibleToUser(action, controller)) {

            RouteValueDictionary parsedextraRVs = null;
            if (extraRVs != null && extraRVs.GetType().Name == "RouteValueDictionary") {
                parsedextraRVs = (RouteValueDictionary)extraRVs;
            }

            RouteValueDictionary parsedHtmlAttributes = null;
            if (htmlAttributes != null && htmlAttributes.GetType().Name == "RouteValueDictionary") {
                parsedHtmlAttributes = (RouteValueDictionary)htmlAttributes;
            }


            return htmlHelper.ActionLink(linkText, action, controller, parsedextraRVs == null ? extraRVs : parsedextraRVs, parsedHtmlAttributes == null ? htmlAttributes : parsedHtmlAttributes).ToHtmlString();
        }


但这也给了我我上面发布的网址。
为什么这在我的ActionLinkwParams方法中有效,但在ActionLinkwParams调用SecurityTrimmedActionLink方法时无效?以及我该如何解决?

最佳答案

修改SecurityTrimmedActionLink方法的签名为此:

public static string SecurityTrimmedActionLink(
    this HtmlHelper htmlHelper,
    string linkText,
    string action,
    string controller,
    RouteValueDictionary extraRVs,
    RouteValueDictionary htmlAttributes
)


注意thisthis之间的区别。在您的情况下(不起作用的情况),您正在调用第二个重载对象,但是在您的情况下,您不是在传递匿名对象,而是传递RouteValueDictionary,它被视为一个匿名对象及其公共属性(Count,键,值)被序列化为属性。

备注:您的助手方法不正确。他们返回字符串。这不是应该的样子。辅助方法应返回MvcHtmlString

所以代替

public static string ActionLinkwParams(...)
{
    ...
    return helper.ActionLink(linktext, action, controller, m, htmlAtts).ToHtmlString();
}


它应该是:

public static MvcHtmlString ActionLinkwParams(...)
{
    ...
    return helper.ActionLink(linktext, action, controller, m, htmlAtts);
}

10-06 08:28