在html标签内添加html输入

Jam*_*man 14 razor asp.net-mvc-3

所以我正在使用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>
Run Code Online (Sandbox Code Playgroud)

唯一的问题是收音机按钮和复选框.Twitter Bootstrap调用HTML5样式标签,包括收音机或复选框输入INSIDE标签标签,如下所示

        <label class="checkbox">
           <input type="checkbox"> Check me out
        </label>
Run Code Online (Sandbox Code Playgroud)

如果我不能用@Html创建这些或者重载,我至少可以获得Labelfor创建的文本吗?

        <label class="checkbox">
           @Html.EditorFor(m=> m.Prop)
           @Html.TheVariableThatContainsTheTextThatLabelForUsesFor(m => m.Prop)
        </label>
Run Code Online (Sandbox Code Playgroud)

Mir*_*rko 15

为什么不能用@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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:

这个修订版怎么样?这复制了标签的确切内容.


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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Kra*_*mer 11

触及Mirko提到的关于MVC 4的内容,这是我在视图中使用的代码(没有自定义帮助器).

<div class="checkbox">
    <label>
        @Html.CheckBoxFor(m => m.RememberMe) @Html.DisplayNameFor(m => m.RememberMe)
    </label>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 简短而简单.完美的我需要的东西.我更喜欢这个,因为自定义助手似乎有点矫枉过正 (2认同)

Tod*_*odd 5

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

@using (Html.BeginLabelFor(m => m.CheckMe, new { @class = "checkbox" })) {
    @Html.CheckBoxFor(m => m.CheckMe)
}
Run Code Online (Sandbox Code Playgroud)

这将呈现嵌套结构,同时允许您使用常规HTML帮助程序来选中复选框和单选按钮.

<label class="checkbox" for="CheckMe">
    <input type="checkbox" name="CheckMe" value="true" /> Hey, Check Me!
</label>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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