HtmlHelper内部RazorEngine模板

时间:2017-07-01 00:20:27

标签: c# asp.net-mvc html-helper razorengine

我在HtmlHelper扩展程序中的MVC应用中使用RazorEngine,因此:

MyHtmlHelpers.cs:

public static MvcHtmlString MyTextBox(this HtmlHelper helper, string label, string value)
{
    var model = new { id = Guid.NewGuid().ToString(), label = label, value = value};
    string view = @"
        <label for=""@Model.id"">@Model.label</label>
        <input id=""@Model.id"" name=""@Model.id"" type=""text"" value=""@Model.value"" placeholder=""@Model.label"" />
    ";
    string renderedView = Engine.Razor.RunCompile(view, "MyTextBox", model: model);
    return new MvcHtmlString(renderedView);
}

我在* .cshtml中使用如下:

@Html.MyTextBox("Enter Some Text", "")

一切都很好。但是,当我尝试将帮助器嵌套在另一个帮助器中时,它会崩溃,如下所示:

public static MvcHtmlString MyName(this HtmlHelper helper, string firstName, string lastName)
{
    var model = new { firstName = firstName, lastName = lastName };
    string view = @"
        @Html.MyTextBox(""First Name"", @Model.firstName)
        @Html.MyTextBox(""Last Name"", @Model.lastName)
    ";
    string renderedView = Engine.Razor.RunCompile(view, "MyName", model: model);
    return new MvcHtmlString(renderedView);
}

以上给了我

  

当前上下文中不存在名称“Html”

当我尝试

@Html.MyName("Peter", "Griffin")

我认为是因为RazorEngine不像MVC那样支持@Html。 (上述错误并非特定于我自己的HtmlHelper或它调用RazorEngine的事实,但适用于@Html的任何用法。)

这有什么办法吗?我希望能够将这些帮助程序嵌套到任意数量的深层,因此需要能够在RazorEngine模板中使用@Html到其完整功能。或者RazorEngine不是一个好的途径吗?我是一个RazorEngine菜鸟,所以忍受我。

1 个答案:

答案 0 :(得分:0)

不使用 HtmlHelper,但实现了类似的结果:

public class MyHelper
{
    public static string MyTextBox(string label, string value)
    {
        var model = new { id = Guid.NewGuid().ToString(), label = label, value = value};
        string view = @"
            <label for=""@Model.id"">@Model.label</label>
            <input id=""@Model.id"" name=""@Model.id"" type=""text"" value=""@Model.value"" placeholder=""@Model.label"" />
        ";
        string renderedView = Engine.Razor.RunCompile(view, "MyTextBox", model: model);
        return renderedView;
    }

    public static string MyName(string firstName, string lastName)
    {
        var model = new { firstName = firstName, lastName = lastName };
        string view = @"
            @Raw(MyHelper.MyTextBox(""First Name"", @Model.firstName))
            @Raw(MyHelper.MyTextBox(""Last Name"", @Model.lastName))
        ";
        string renderedView = Engine.Razor.RunCompile(view, "MyName", model: model);
        return renderedView;
    }
}

变更摘要:

  • 将返回类型更改为字符串
  • 删除扩展参数
  • 用下面替换@Html 引用
  • 进入自己的助手类

像这样使用:

@Raw(MyHelper.MyName("Peter", "Griffin"))

参考:https://antaris.github.io/RazorEngine/Encoding.html