Asp.net mvc 如何在MVC Razor中将属性值传递给自定义HtmlHelper?

Asp.net mvc 如何在MVC Razor中将属性值传递给自定义HtmlHelper?,asp.net-mvc,razor,html-helper,Asp.net Mvc,Razor,Html Helper,我为Razor创建了一个定制的HTMLHelper扩展方法 public static MvcHtmlString BootstrapButtonGroupForEnum<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { // render stuff } 它可以很好地添加

我为Razor创建了一个定制的HTMLHelper扩展方法

public static MvcHtmlString BootstrapButtonGroupForEnum<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
   // render stuff
}
它可以很好地添加记录,但是如何将模型方法的值传递给它呢?所以我可以预先选择一个值。我是否需要通过一个额外的参数来传递值,或者是否有一种更优雅的方法来实现这一点。我看了一下手表,没有看到它的价值,我错过了什么吗

谢谢

编辑: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());
        }
public静态MvcHtmlString BootstrapButtonGroupForEnum(
这个HtmlHelper HtmlHelper,
表达式(表达式)
{
var metaData=modelmetada.FromLambdaExpression(表达式,htmlHelper.ViewData);
字符串[]listOfNames=Enum.GetNames(metaData.ModelType);
var sb=新的StringBuilder();
if(listOfNames!=null)
{
sb=sb.追加(“”);
foreach(名称列表中的var值)
{
某人加上(“”);
sb.Append(value.ToString().UnPascalCase());
某人加上(“”);
}
sb=sb.追加(“”);
sb=sb.AppendFormat(“,metaData.PropertyName”);
}
返回MvcHtmlString.Create(sb.ToString());
}

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

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

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

我需要将隐藏的值分配给metaData.Model,并从那里获取它

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

您可以从表达式创建模型元数据,但是您认为需要这样做的事实表明您不了解如何创建自定义扩展方法。您应该使用内置的扩展。一些示例(选项3)和。如果您有问题,请发布代码。我的实现大致基于以下内容:。我在编辑中添加了helper方法的完整实现。这意味着您将复制脚本(更不用说用行为污染标记是不好的做法)。很难理解您真正想要做什么-您的方法名为
BootstrapButtonGroupForEnum
,但您没有生成单选按钮+1点输出脚本,完全同意。在这一阶段,我只是想让它工作起来,一旦完成,我肯定会找出脚本并通过类将其连接起来。强烈建议您探索一些内置帮助程序的源代码,以了解应该如何完成。您可以从表达式创建模型元数据,然而,您认为需要这样做的事实表明您不了解如何创建自定义扩展方法。您应该使用内置的扩展。一些示例(选项3)和。如果您有问题,请发布代码。我的实现大致基于以下内容:。我在编辑中添加了helper方法的完整实现。这意味着您将复制脚本(更不用说用行为污染标记是不好的做法)。很难理解您真正想要做什么-您的方法名为
BootstrapButtonGroupForEnum
,但您没有生成单选按钮+1点输出脚本,完全同意。在这一阶段,我只是想让它工作起来,一旦完成了,我肯定会把脚本分解出来,并通过类将其连接起来。强烈建议您探索一些内置帮助程序的源代码,以了解应该如何完成。
var hidden = InputExtensions.HiddenFor(htmlHelper, expression, null);
sb.Append(hidden );