所以这就是:
我有一个html帮助器,它使用当前url的可选参数呈现ActionLink
s。这个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&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&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
方法时却没有?以及如何解决此问题?
答案 0 :(得分:6)
将SecurityTrimmedActionLink
方法的签名修改为:
public static string SecurityTrimmedActionLink(
this HtmlHelper htmlHelper,
string linkText,
string action,
string controller,
RouteValueDictionary extraRVs,
RouteValueDictionary htmlAttributes
)
请注意this和this之间的区别。在你的情况下(那个不起作用的那个)你正在调用第二个重载的对象,但在你的情况下,你没有传递匿名对象,而是一个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);
}
答案 1 :(得分:0)
所以我最后做了什么(感谢Darin)做了一些额外的重载来完成这项工作。
public static MvcHtmlString SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string action) {
return SecurityTrimmedActionLink(htmlHelper, linkText, action, null, null);
}
public static MvcHtmlString SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string action, string controller) {
return SecurityTrimmedActionLink(htmlHelper, linkText, action, controller, null);
}
public static MvcHtmlString SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string action, object extraRVs) {
return SecurityTrimmedActionLink(htmlHelper, linkText, action, null, extraRVs, null);
}
public static MvcHtmlString SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string action, string controller, object extraRVs) {
return SecurityTrimmedActionLink(htmlHelper, linkText, action, controller, extraRVs, null);
}
public static MvcHtmlString SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string action, RouteValueDictionary extraRVs) {
return SecurityTrimmedActionLink(htmlHelper, linkText, action, null, extraRVs, null);
}
public static MvcHtmlString SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string action, string controller, RouteValueDictionary extraRVs) {
return SecurityTrimmedActionLink(htmlHelper, linkText, action, controller, extraRVs, null);
}
public static MvcHtmlString SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string action, string controller, object extraRVs, object htmlAttributes) {
RouteValueDictionary rv = new RouteValueDictionary(extraRVs);
RouteValueDictionary html = new RouteValueDictionary(htmlAttributes);
return SecurityTrimmedActionLink(htmlHelper, linkText, action, controller, extraRVs, html);
}
public static MvcHtmlString SecurityTrimmedActionLink(this HtmlHelper htmlHelper, string linkText, string action, string controller, RouteValueDictionary extraRVs, IDictionary<String, Object> htmlAttributes) {
if (controller == null) {
RouteData routeData = htmlHelper.ViewContext.RouteData;
controller = routeData.GetRequiredString("controller");
}
if (IsAccessibleToUser(action, controller)) {
return htmlHelper.ActionLink(linkText, action, controller, extraRVs, htmlAttributes);
} else {
return MvcHtmlString.Empty;
}
}