【发布时间】: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?
【问题讨论】:
-
我的实现大致基于此:jlum.ws/post/2013/11/5/…。我在 EDIT 中添加了辅助方法的完整实现。
-
首先你不应该在帮助程序中输出脚本。这意味着您将复制脚本(更不用说用行为污染您的标记不是好的做法)。很难理解你真正想要做什么 - 你的方法被命名为
BootstrapButtonGroupForEnum但你没有生成单选按钮 -
+1 关于输出脚本的观点,完全同意。在这个阶段,我只是想让它工作,一旦完成,我一定会分解脚本并通过类连接它。
-
强烈建议您探索一些内置助手的源代码,以了解应该如何完成。
标签: asp.net-mvc razor html-helper