ASP.NET中使用C#将Shortcode替换为PartialView时遇问题
问题:数据库中定义的Shortcode未被PartialView替换
我在数据库里定义了若干Shortcode,但在视图展示时,这些Shortcode没有被字典中指定的PartialView内容替换。以下是我的代码:
@{ var input = "<div>Hello This is Same</div><div>{partv _AllPages}</div><div>Some Content</div><div>{partv _AllPost}</div>"; var replacements = new Dictionary<string, string> { { "{partv _AllPages}", Html.Partial("_AllPages").ToString()}, { "{partv _AllPost}", Html.Partial("_AllPost").ToString()} }; var output = replacements.Aggregate(input, (current, replacement) => current.Replace(replacement.Key, replacement.Value)); } @Html.Raw(HttpUtility.HtmlDecode(output))
可能的原因及解决方法
1. PartialView输出被编码
Html.Partial()返回的是MvcHtmlString,调用ToString()会自动对HTML内容进行编码,导致替换后的内容是转义后的HTML代码,即便后续用HtmlDecode也可能出现异常。
解决: 使用ToHtmlString()替代ToString(),直接获取未编码的HTML内容。
2. 输入内容提前被编码
如果数据库中存储的Shortcode本身是HTML转义后的(比如{被转成{),那么原input中的Shortcode和字典的Key无法匹配,导致替换失败。
解决: 先对输入内容进行HTML解码,再执行替换操作。
3. PartialView本身无输出
如果_AllPages或_AllPost PartialView本身没有渲染任何内容,替换后自然看不到效果。可以先单独渲染PartialView验证:
@Html.Partial("_AllPages")
修改后的代码示例
@{ var input = "<div>Hello This is Same</div><div>{partv _AllPages}</div><div>Some Content</div><div>{partv _AllPost}</div>"; // 先解码输入内容,确保Shortcode格式正确 var decodedInput = HttpUtility.HtmlDecode(input); var replacements = new Dictionary<string, string> { // 使用ToHtmlString()获取未编码的PartialView内容 { "{partv _AllPages}", Html.Partial("_AllPages").ToHtmlString()}, { "{partv _AllPost}", Html.Partial("_AllPost").ToHtmlString()} }; var output = replacements.Aggregate(decodedInput, (current, replacement) => current.Replace(replacement.Key, replacement.Value)); } // 直接输出处理后的内容,无需再次解码 @Html.Raw(output)
内容的提问来源于stack exchange,提问作者Rao Shankar
相关产品推荐
相关产品推荐

