在自定义HtmlHelper中使用HtmlHelper

时间:2014-08-22 18:02:00

标签: asp.net-mvc html-helper

有没有办法做之类的以下内容:

public static IHtmlString TableFor(this HtmlHelper helper, IEnumerable<MaterialGroup> groups, Func<HtmlHelper, MaterialGroup, int, string> tableContentsFunc)
{
    return MvcHtmlString.Create("@Html.TextBoxFor(x => this.Model.Something)");
}

显然这是一个微不足道的例子,但是当我尝试某种类型的东西时,它会将帮助者"@Html.TextBoxFor(x => this.Model.Something)"呈现为页面上的文本,而不是将它们作为帮助程序处理。

有没有办法实现这个目标?


public static MvcHtmlString TableFor(this HtmlHelper<IEnumerable<MaterialGroup>> helper, IEnumerable<MaterialGroup> groups, Func<HtmlHelper<MaterialGroup>, MaterialGroup, int, string> tableContentsFunc)
{
    String html = "<table class='materials joists'>";
    String endHtml = "</table>";

    for (int i = 0; i < groups.Count(); ++i)
    {
        HtmlHelper<MaterialGroup> groupHelper = new HtmlHelper<MaterialGroup>(helper.ViewContext, helper.ViewDataContainer); // Crashes here with cannot convert IEnumerable<MaterialGroup> to MaterialGroup.
        html += TbodyFor(groupHelper , groups.ElementAt(i), i);
        html += tableContentsFunc(groupHelper , groups.ElementAt(i), i);
    }

    return MvcHtmlString.Create(html + endHtml);
}

public static string TbodyForJoists(this HtmlHelper<MaterialGroup> helper, MaterialGroup group, int index)
{
    string html = string.Empty;
    MvcHtmlString markTextbox = InputExtensions.TextBoxFor<MaterialGroup, String>(helper, x => group.Joists.ElementAt(i).Mark, new { Name = "MaterialGroups[" + index + "].Joists[" + i + "].Mark", Class = "auto-size first-column" });
    html += martTextbox;
    .
    .
    .
    return html;
}

当我尝试上述操作时,我遇到了HtmlHelper<>类型的问题。 如果我把它留给HtmlHelper我会得到一个错误告诉我明确状态,因为它不知道我在做什么。如果我明确说明是否有转换?我想你可以说的问题。

如何以这种方式简单地使用TextBoxFor?

1 个答案:

答案 0 :(得分:0)

因为这实际上是你告诉它要做的事情。 Razor不处理助手本身的输出。无论你返回什么,都是页面上的内容。

但是,你可以随时这样做:

MvcHtmlString textBox = Html.TextBoxFor(expression);

并且,您必须向助手提供要使用的表达式。在这种情况下,使用Html.TextBox可能会更容易,但是您将需要做更多的工作来尝试找出正确的名称等字段。

只需使用编辑器模板来处理此类事情,就会变得更容易,更简单。