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()))