【问题标题】:Adding html Input inside an html label在 html 标签内添加 html 输入
【发布时间】:2012-05-16 21:20:23
【问题描述】:

所以我正在使用Twitter Bootstrap,我的大多数表单都看起来很棒

       <div class="control-group">
            @Html.LabelFor(m => m.Prop)
            <div class="controls">
                @Html.EditorFor(m => m.Prop)
            </div>
            @Html.ValidationMessageFor(model => model.Prop)
        </div>

唯一的问题是单选按钮和复选框。 Twitter Bootstrap 调用 HTML5 样式标签,其中包括像这样的标签标签内的单选或复选框输入

        <label class="checkbox">
           <input type="checkbox"> Check me out
        </label>

如果我无法使用 @Html 或重载创建这些内容,我至少可以访问 Labelfor 创建的文本吗?

        <label class="checkbox">
           @Html.EditorFor(m=> m.Prop)
           @Html.TheVariableThatContainsTheTextThatLabelForUsesFor(m => m.Prop)
        </label>

【问题讨论】:

标签: asp.net-mvc-3 razor


【解决方案1】:

为什么不能用@Html 创建这些。如果您编写自己的扩展方法(见下文)应该这样做,不是吗?


public static class HtmlHelperExtensions
    {
        public static MvcHtmlString MyCheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlLabelAttributes = null, object htmlCheckBoxAttributes = null)
        {
            var checkbox = htmlHelper.CheckBoxFor(expression, htmlCheckBoxAttributes);

            var labelTag = new TagBuilder("label");
            labelTag.AddCssClass("checkbox");
            labelTag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlLabelAttributes));
            labelTag.InnerHtml = checkbox.ToString();

            return new MvcHtmlString(labelTag.ToString());
        }
    }

编辑:

这个修订版怎么样。这完全复制了标签的作用。


public static class HtmlHelperExtensions
{
    public static MvcHtmlString MyCheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlLabelAttributes = null, object htmlCheckBoxAttributes = null)
    {
        var checkbox = htmlHelper.CheckBoxFor(expression, htmlCheckBoxAttributes);

        var labelTag = new TagBuilder("label");
        var checkboxName = ExpressionHelper.GetExpressionText(expression);
        labelTag.AddCssClass("checkbox");
        labelTag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlLabelAttributes));
        labelTag.InnerHtml = checkbox.ToString() + LabelHelper(ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData), checkboxName);

        return new MvcHtmlString(labelTag.ToString());
    }

    private static MvcHtmlString LabelHelper(ModelMetadata metadata, string fieldName)
    {
        string labelText;
        var displayName = metadata.DisplayName;

        if (displayName == null)
        {
            var propertyName = metadata.PropertyName;

            labelText = propertyName ?? fieldName.Split(new[] { '.' }).Last();
        }
        else
        {
            labelText = displayName;
        }

        if (string.IsNullOrEmpty(labelText))
        {
            return MvcHtmlString.Empty;
        }

        return new MvcHtmlString(labelText);
    }
}

我应该注意到,在 MVC 4 中,有一个 DisplayNameFor Helper,因此整个标签业务可以简化一点。

【讨论】:

  • 确实很接近,但缺少 LabelFor 的内容,因此文本框显示为没有文本。所以我想我需要添加类似 var label = htmlHelper.LabelFor(expression, htmlCheckBoxAttributes);
【解决方案2】:

谈到 Mirko 提到的关于 MVC 4 的内容,这是我在视图中使用的代码(没有自定义帮助程序)。

<div class="checkbox">
    <label>
        @Html.CheckBoxFor(m => m.RememberMe) @Html.DisplayNameFor(m => m.RememberMe)
    </label>
</div>

【讨论】:

  • 简短而简单。非常适合我需要的东西。我更喜欢这个,因为自定义助手看起来有点矫枉过正
【解决方案3】:

我刚刚构建了一个反映表单在 ASP.NET MVC 中的工作方式的解决方案。

@using (Html.BeginLabelFor(m => m.CheckMe, new { @class = "checkbox" })) {
    @Html.CheckBoxFor(m => m.CheckMe)
}

这会呈现嵌套结构,同时允许您使用普通的 HTML 帮助器来处理复选框和单选按钮。

<label class="checkbox" for="CheckMe">
    <input type="checkbox" name="CheckMe" value="true" /> Hey, Check Me!
</label>

BeginLabel 和 BeginLabelFor 分别支持与 Label 和 LabelFor 相同的签名。

https://github.com/toddlucas/bootstrap-mvc.net

我希望其他人觉得这很有用。

编辑:

在新的 Visual Studio 2013 MVC 模板中采用的另一种方法是执行以下操作:

<div class="checkbox">
    @Html.CheckBoxFor(m => m.CheckMe)
    @Html.LabelFor(m => m.CheckMe)
</div>

新模板使用 Twitter Bootstrap 3.0,遵循与 2.x 相同的约定。

【讨论】:

  • 如果您需要特殊的标签显示文本,请在模型代码中将其配置为 Display 属性,或使用 LabelFor 方法的替代形式来指定要使用的标签文本。
【解决方案4】:

我的最终解决方案是自定义引导标签助手

    public static MvcHtmlString BootstrapCheckBoxFor<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, bool>> expression, object htmlLabelAttributes = null, object htmlCheckBoxAttributes = null)
    {
        var checkbox = htmlHelper.CheckBoxFor(expression, htmlCheckBoxAttributes);
        var label = htmlHelper.LabelFor(expression, htmlCheckBoxAttributes);
        string text = Regex.Match(label.ToString(), "(?<=^|>)[^><]+?(?=<|$)").Value;

        var labelTag = new TagBuilder("label");
        labelTag.AddCssClass("checkbox");
        labelTag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlLabelAttributes));
        labelTag.InnerHtml = checkbox.ToString() + text;

        return new MvcHtmlString(labelTag.ToString());
    }

【讨论】:

  • 我添加了一个修订版。看一下,LabelHelper 的逻辑正是框架在内部做的,就是想出标签文本,不需要“Screen Scrape”;它。希望对您有所帮助。
【解决方案5】:

而不是像这样直接渲染LabelFor方法的返回值:

@Html.LabelFor(m => m.Prop, "Text <a>HTML Tag</a>")

首先将输出设置为 decode 的变量和解码文本的渲染器:

MvcHtmlString label = Html.LabelFor(m => m.Prop, "Text <a>HTML Tag</a>");
@Html.Raw(HttpUtility.HtmlDecode(label.ToString()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    相关资源
    最近更新 更多