【问题标题】:How can I make my own Razor Helper method like @Html.TextBoxFor()?如何制作自己的 Razor Helper 方法,例如 @Html.TextBoxFor()?
【发布时间】:2013-09-16 18:09:18
【问题描述】:

我想实现类似于@Html.TextBoxFor 的东西,但改为调用@Html.SwitchFor() 从我正在使用的布尔值创建一个是/否开关,而不必每次都添加额外的html和类。

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

【问题讨论】:

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


    【解决方案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);
       }
    

    传递正确的东西

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

    做你想做的事并返回默认实现

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

    拨打电话

    剩下要做的就是按照您最初的意图拨打电话。

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

    让它成为助手

    这比我最初预期的要复杂一些,但可以做到,只需将以下代码添加到您选择的 cshtml 文件中的 App_Code 文件夹中。由于您不能在辅助函数中使用 Generics,因此您必须在 @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))
    

    顺便说一句, 这很棒!它将帮助我以更自然的方式布置多列表单。我很高兴遇到您的挑战,因为这是我自己没有想到的解决方案。

    祝你好运,玩得开心!

    【讨论】:

      【解决方案2】:

      我找到了一些帮助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 => x.param

      【讨论】:

        猜你喜欢
        • 2012-12-09
        • 1970-01-01
        • 2021-03-28
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        相关资源
        最近更新 更多