Asp.net mvc 如何创建自己的Razor助手方法,如@Html.TextBoxFor()?

Asp.net mvc 如何创建自己的Razor助手方法,如@Html.TextBoxFor()?,asp.net-mvc,razor,razor-2,razorengine,Asp.net Mvc,Razor,Razor 2,Razorengine,我想实现类似于@Html.TextBoxFor的东西,但改为@Html.SwitchFor(),以便从我正在使用的bool创建yes/no开关,而不必每次添加额外的Html和类 有没有办法用razor语法实现这一点?我找到了一些帮助: 一些简单的示例代码: public static class HtmlHelperExtensions { public static MvcHtmlString SwitchSlider(this HtmlHelper helper, bool valu

我想实现类似于@Html.TextBoxFor的东西,但改为@Html.SwitchFor(),以便从我正在使用的bool创建yes/no开关,而不必每次添加额外的Html和类

有没有办法用razor语法实现这一点?

我找到了一些帮助:

一些简单的示例代码:

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

我仍然不确定如何复制文本框之类的东西并传入x=>x.param

您可能会很幸运。

请注意,您应该发现自己将鼠标悬停在文本框上,然后在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);
   }
让它成为助手

这比我最初预期的要复杂一些,但它是可以做到的,只需将以下代码添加到您选择的cshtml文件中的App\u code文件夹中即可。由于不能在helpers函数中使用泛型,因此必须在@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>
}
顺便说一下, 这太棒了!它将帮助我以更自然的方式布置多列形式。我很高兴我遇到了你的挑战,因为这是一个我从未想到过的解决方案

祝你好运,玩得开心

@(Html.SwitchFor(m => m.Data, true))
@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>
}
@(Html.SwitchFor(Html, m => m.Data, true))