【问题标题】:How to pass property value to custom HtmlHelper in MVC Razor?如何将属性值传递给 MVC Razor 中的自定义 HtmlHelper?
【发布时间】:2015-11-07 23:26:26
【问题描述】:

我为 Razor 创建了一个自定义 HTMLHelper 扩展方法

public static MvcHtmlString BootstrapButtonGroupForEnum<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
   // render stuff
}

并像这样使用它:

@Html.BootstrapButtonGroupForEnum(model => model.PriceType)

它可以很好地添加记录,但是如何将模型方法的值传递给它?所以我可以预先选择一个值。我是否需要通过附加参数传递值,或者是否有更优雅的方式来执行此操作。我查看了 Watch 并没有看到那里的值,我错过了什么吗?

谢谢!

编辑:html 助手的完整实现:​​

public static MvcHtmlString BootstrapButtonGroupForEnum<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression)
        {
            var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);

            string[] listOfNames = Enum.GetNames(metaData.ModelType);

            var sb = new StringBuilder();

            if (listOfNames != null)
            {

                sb = sb.Append("<div class=\"btn-group btn-group\" role=\"group\" >");

                foreach (var value in listOfNames)
                {

                    sb.Append("<button type=\"button\" class=\"btn btn-primary\" onclick=\"");

                    // onclick event hadler
                    sb.AppendFormat("$('#{0}').val('{1}');", metaData.PropertyName, value); // get the value to the hidden
                    sb.Append("$(this).addClass('active').siblings().removeClass('active');"); // retain selection

                    sb.Append("\">");
                    sb.Append(value.ToString().UnPascalCase());
                    sb.Append("</button>");

                }

                sb = sb.Append("</div>");

                sb = sb.AppendFormat("<input type=\"hidden\" id=\"{0}\" name=\"{0}\" />", metaData.PropertyName);

            }

            return MvcHtmlString.Create(sb.ToString());
        }

我想我可以尝试使用 @HiddenFor(...) 而不是直接将其呈现为 html?

【问题讨论】:

  • 您可以从表达式创建模型元数据,但是您认为需要这样做的事实表明您不了解如何创建自定义扩展方法。您应该使用内置扩展。一些例子here(选项3)和here。如果您遇到问题,请发布您的代码。
  • 我的实现大致基于此:jlum.ws/post/2013/11/5/…。我在 EDIT 中添加了辅助方法的完整实现。
  • 首先你不应该在帮助程序中输出脚本。这意味着您将复制脚本(更不用说用行为污染您的标记不是好的做法)。很难理解你真正想要做什么 - 你的方法被命名为 BootstrapButtonGroupForEnum 但你没有生成单选按钮
  • +1 关于输出脚本的观点,完全同意。在这个阶段,我只是想让它工作,一旦完成,我一定会分解脚本并通过类连接它。
  • 强烈建议您探索一些内置助手的源代码,以了解应该如何完成。

标签: asp.net-mvc razor html-helper


【解决方案1】:

我需要将 hidden 的值分配给 metaData.Model 并从那里获取它。

 sb = sb.AppendFormat("<input type=\"hidden\" id=\"{0}\" name=\"{0}\" value=\"" + metaData.Model + "\" />", metaData.PropertyName);

更正:在遵循 Stephens 的建议并查看 MVC 源代码后,我得出结论,隐藏应该像这样呈现:

var hidden = InputExtensions.HiddenFor(htmlHelper, expression, null);
sb.Append(hidden );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多