如何制作自己的Razor Helper方法,如@ Html.TextBoxFor()?

时间:2013-09-16 18:09:18

标签: asp.net-mvc razor razor-2 razorengine

我想实现类似于@ Html.TextBoxFor的东西,而是调用@ Html.SwitchFor()来创建一个我正在使用的bool的yes / no开关,而不必每次都添加额外的html和类。

有没有办法用剃刀语法来做到这一点?

2 个答案:

答案 0 :(得分:1)

你可能会有运气。

请注意,您应该发现自己将鼠标悬停在 TextBoxFor 上,然后点击 Visual Studio 中的 F12 ,您将获得该方法的签名你是想模仿。这是一个很好的起点,但如果你没有花时间,它有点难以阅读。

public static MvcHtmlString SwitchFor<TModel>(
   this HtmlHelper<TModel> helper, Expression<Func<TModel, 
           Object>> expression, Boolean wrap)
   {
        return wrap
            ? MvcHtmlString.Create(String.Format("<div class='helloworld'>{0}</div>", 
              helper.TextAreaFor(expression))) : helper.TextAreaFor(expression);
   }

传递正确的东西

您需要将表达式传递给 TextBoxFor 扩展名。 m =&gt; 的方法签名是 Func ,它将 TModel (m)传递给函数并返回一个对象。

执行您想要的操作并返回默认实施

你可以放任何东西。如果 wrap 设置为false,您可以看到我只返回传递表达式的原始方法调用。

拨打电话

剩下要做的就是按照你原先想要的方式拨打电话。

@(Html.SwitchFor(m => m.Data, true))

让它成为帮手

这比我最初预期的要复杂一点但是可以完成,只需将以下代码添加到您选择的 cshtml 文件中的 App_Code 文件夹中。由于您无法在辅助函数中使用泛型,因此您必须在 @function {} 块中创建具有正确签名的实际函数。

@using System.Linq.Expressions
@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@functions
{
    public static HelperResult SwitchFor<TModel, Object>(HtmlHelper<TModel> html, Expression<Func<TModel, Object>> func, Boolean wrap)
    {
        var data = html.TextAreaFor(func);
        return WrapItUp(data);
    }
}
@helper WrapItUp(MvcHtmlString data)
{
    <div class="helloworld">
        @(data)
    </div>
}

拨打电话,几乎

您必须将键入的HtmlHelper实例传递给您的模型。

@(Html.SwitchFor(Html, m => m.Data, true))
顺便说一下, 这很棒!它将帮助我以更自然的方式布置多列表单。我很高兴我遇到了你的挑战,因为这是一个我没想过的解决方案。

祝你好运N玩得开心!

答案 1 :(得分:0)

我找到了一些帮助Here

一些简单的示例代码:

public static class HtmlHelperExtensions
{
    public static MvcHtmlString SwitchSlider(this HtmlHelper helper, bool value)
    {
        return new MvcHtmlString("<div>html i want to output here</div>");
    }
}

允许您这样做:

@Html.SwitchSlider(true);

我仍然不确定如何复制TextBox For 和传入x =&gt;等内容。 x.param