0

我目前正在将我的 aspx mvc 视图迁移到 razor 引擎,但是当涉及到我的助手时,我遇到了一些麻烦。

我不确定为什么,但是当我尝试在其 html 扩展表单中使用帮助程序时,我的帮助程序被呈现为文本而不是标记,我得到的是文本而不是 html。

扩展的代码是:

    public static string LinkButton(this HtmlHelper helper, string id, string value, string target, object htmlAttributes)
    {
        var linkButton = new TagBuilder("div");
        var attributes = new RouteValueDictionary(htmlAttributes);

        linkButton.MergeAttribute("id", id);

        //-- apply the button class to the div and any other classes to the button
        linkButton.MergeAttribute("class", attributes.ContainsKey("class") ? string.Format("linkbutton {0}", attributes["class"]) : "linkbutton");

        var content = new TagBuilder("a");
        content.MergeAttribute("href", target);
        content.InnerHtml = value;

        linkButton.InnerHtml = content.ToString();
        return linkButton.ToString();
    }

这是一个非常简单的扩展,它的用法如下:

[ul]
    @foreach(ViewBag.Modules 中的 UpModule 模块)
    {
        [li]@Html.LinkBut​​ton(module.Name, module.Value, module.Target, new {@class = "landingButton"});[/li]
    }
[/ul]

除了明显错误的 html 标签之外,我搞砸了什么?

编辑 我应该注意到存在不正确的标记,因为我无法在我的问题中显示正确的标记,并且我完全知道它不会起作用。

4

2 回答 2

1

通过 razor 语法在模板中返回的字符串@默认为 HTML 编码,以便不直接输出 HTML 标记。

var s = "<p>text</p>";
....
@s

将输出类似于

&lt;p&gt;text&lt;/p&gt;

为了防止这种情况,您可以使用HtmlHelpersRaw方法:

@Html.Raw(s)

或者您可以使用HtmlString(或在 .NET 4 之前MvcHtmlString):

var s = new HtmlString("<p>text</p>");

通过使用HtmlString( MvcHtmlString),razor 知道不对输出字符串进行 HTML 编码。


因此,在您的特定情况下,您要么使用@Html.Raw(Html.LinkButton(...)),要么更改辅助扩展的输出类型:

public static HtmlString LinkButton(this HtmlHelper helper, string id, string value, string target, object htmlAttributes)
...
return new HtmlString(linkButton.ToString());
于 2013-01-21T21:36:43.753 回答
0

@voroninp 将返回类型从字符串切换到 MvcHtmlString 效果很好,但是在这种情况下,使用声明性帮助器是一个更清晰的选择,尽管为我更复杂的帮助器切换返回类型会更好。

于 2013-01-21T21:00:54.750 回答