Asp.net mvc 3 在html标签中添加html输入

Asp.net mvc 3 在html标签中添加html输入,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,所以我正在使用,我的大多数表单都用这个看起来很棒 <div class="control-group"> @Html.LabelFor(m => m.Prop) <div class="controls"> @Html.EditorFor(m => m.Prop) </div> @Html.Validatio

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

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

@LabelFor(m=>m.Prop)
@EditorFor(m=>m.Prop)
@Html.ValidationMessageFor(model=>model.Prop)
唯一的问题是单选按钮和复选框。TwitterBootstrap调用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>

@EditorFor(m=>m.Prop)
@Html.thevariables,其中包含用于(m=>m.Prop)的LabelFor文本

为什么不能用@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());
        }
    }

公共静态类HtmlHelperExtensions
{
公共静态MvcHtmlString MyCheckBoxFor(此HtmlHelper HtmlHelper,表达式表达式,对象HTMLABELATTRIBUTES=null,对象HTMLCHECKBOXDATTRIBUTES=null)
{
var checkbox=htmlHelper.CheckBoxFor(表达式,htmlCheckBoxAttributes);
var labelTag=新标记生成器(“标签”);
labelTag.AddCssClass(“复选框”);
labelTag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlLabelAttributes));
labelTag.InnerHtml=checkbox.ToString();
返回新的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);
    }
}

公共静态类HtmlHelperExtensions
{
公共静态MvcHtmlString MyCheckBoxFor(此HtmlHelper HtmlHelper,表达式表达式,对象HTMLABELATTRIBUTES=null,对象HTMLCHECKBOXDATTRIBUTES=null)
{
var checkbox=htmlHelper.CheckBoxFor(表达式,htmlCheckBoxAttributes);
var labelTag=新标记生成器(“标签”);
var checkboxName=ExpressionHelper.GetExpressionText(表达式);
labelTag.AddCssClass(“复选框”);
labelTag.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(htmlLabelAttributes));
labelTag.InnerHtml=checkbox.ToString()+LabelHelper(ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData),checkboxName);
返回新的MvcHtmlString(labelTag.ToString());
}
私有静态MvcHtmlString LabelHelper(ModelMetadata元数据,字符串字段名)
{
字符串标签文本;
var displayName=metadata.displayName;
if(displayName==null)
{
var propertyName=metadata.propertyName;
labelText=propertyName??fieldName.Split(新[]{.'}).Last();
}
其他的
{
labelText=显示名称;
}
if(string.IsNullOrEmpty(labelText))
{
返回MvcHtmlString.Empty;
}
返回新的MvcHtmlString(labelText);
}
}

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

我的最终解决方案是定制引导标签Helper

    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());
    }
public static MvcHtmlString BootstrapCheckBoxFor(此HtmlHelper HtmlHelper,表达式表达式,对象htmlLabelAttributes=null,对象htmlCheckBoxAttributes=null)
{
var checkbox=htmlHelper.CheckBoxFor(表达式,htmlCheckBoxAttributes);
var label=htmlHelper.LabelFor(表达式,htmlCheckBoxAttributes);

string text=Regex.Match(label.ToString(),“(?)[^>关于Mirko提到的MVC4,这是我在视图中使用的代码(没有自定义帮助程序)


@Html.CheckBoxFor(m=>m.RememberMe)@Html.DisplayNameFor(m=>m.RememberMe)

我刚刚构建了一个反映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相同的签名

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

编辑:

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

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

@Html.CheckBoxFor(m=>m.CheckMe)
@LabelFor(m=>m.CheckMe)

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

而不是像下面这样直接呈现LabelFor方法的返回值:

@Html.LabelFor(m => m.Prop, "Text <a>HTML Tag</a>")
@Html.LabelFor(m=>m.Prop,“文本Html标记”)
首先将输出设置为变量decode,并渲染解码文本:

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

你看过这篇文章了吗?这篇文章非常接近,但它缺少LabelFor的内容,因此文本框显示时没有文本。因此我想我需要添加一些内容,比如var label=htmlHelper.LabelFor(表达式,htmlCheckBoxAttributes)“我添加了一个修订版。看一看,LabelHelper逻辑正是框架内部用来产生标签文本的逻辑,不需要“屏幕刮取”它。希望有帮助。如果您需要标签的特殊显示文本,请在模型代码中将其配置为显示属性,或者使用LabelFor方法的另一种形式来指定要使用的标签文本。简短而简单。非常适合我的需要。我更喜欢这种方式,因为自定义帮助程序似乎有些过分
MvcHtmlString label = Html.LabelFor(m => m.Prop, "Text <a>HTML Tag</a>");
@Html.Raw(HttpUtility.HtmlDecode(label.ToString()))