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)
我刚刚构建了一个解决方案,它反映了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相同的约定.
| 归档时间: |
|
| 查看次数: |
12181 次 |
| 最近记录: |