0

我有一个扩展方法,它返回一个MvcHtmlString我意识到是编码的。在某些情况下,我会将查询字符串参数添加到路由中。我想要的结果是这样的:List/View/28?category=0&sort=Default 但是它正在渲染编码的字符串:ListView/28%3fcategory%3d0%26sort%3dDefault

在我的 C# 和我的 Razor 代码中,我尝试对其进行解码,但它没有效果。还有什么我可以尝试的吗?

public static MvcHtmlString GenerateLanguageLink(this HtmlHelper html)
        {
            var routeDictionary = html.ViewContext.RouteData.Values;

            var queryStringCollections = html.ViewContext.HttpContext.Request.QueryString;
            var queryStringText = string.Empty;
            if (queryStringCollections.Count > 0)
            {
                queryStringText = queryStringCollections.ToString();
                routeDictionary["Id"] = HttpUtility.HtmlDecode(routeDictionary["Id"] + string.Format("?{0}", queryStringText));
            }

            return html.ActionLink(linkText, routeDictionary["action"].ToString(), routeDictionary["controller"].ToString(), routeDictionary, null);
        }

剃刀:

@Html.Raw(HttpUtility.HtmlDecode(@Html.GenerateLanguageLink().ToHtmlString()))
4

2 回答 2

0

只需HttpUtility.HtmlDecode从下面删除

routeDictionary["Id"] = HttpUtility.HtmlDecode(routeDictionary["Id"] + string.Format("?{0}", queryStringText));

代码应该是:

routeDictionary["Id"] = (routeDictionary["Id"] + string.Format("?{0}", queryStringText));

并将语法保留在Razor下面

@Html.GenerateLanguageLink()

这将解决您的问题。

于 2013-07-16T16:49:50.537 回答
0

我最终只是添加了额外的路由值,这些值显然会生成正确的查询,而我不必尝试包含这些值并对其进行解码。

    if (queryStringCollections.Count > 0)
    {
        queryStringText = queryStringCollections.ToString();
        routeDictionary["category"] = queryStringCollections[0];
        routeDictionary["sort"] = queryStringCollections[1];
    }

虽然这不能回答我的问题,但这是正确的做法。

于 2013-07-16T17:31:20.583 回答