好的我正在使用带有Bootstrap的MVC 4并遇到TextAreaFor和列的问题。默认情况下,如果未设置col / row,则系统会将2/10作为默认值。显然,如果你输入行/ col,它将使用它。问题在于使用Bootstraper的表单如果你把它留空是更好的。任何人都想出一个很好的方法来禁用TextAreaFor的col。
@Html.TextAreaFor(m=> m.Comments, new { htmlAttributes = new { @class = "form-control" } })
输出:
<textarea cols="20" htmlAttributes="{ class = form-control }" id="Comments" name="Comments" rows="2"></textarea>
但我想要这个:
<textarea htmlAttributes="{ class = form-control }" id="Comments" name="Comments" rows="2"></textarea>
这当然有效但不友好:
<textarea id="Comments" name="Comments" rows="10" class="form-control">@Model.Comments</textarea>
已编辑 - 哦,我创建了一个自定义编辑器模板:
@{
string id = ViewData.ModelMetadata.PropertyName;
string rows = string.Empty;
if (ViewData["rows"] != null)
{
rows = string.Format("rows={0}", ViewData["rows"]);
}
}
<textarea id="@id" name="@id" @rows class="form-control">@Model</textarea>
用法:
@Html.EditorFor(model => model.Comments, "TextAreaCustom", new { @rows = 10 })
答案 0 :(得分:1)
不幸的是,不,你不能关闭助手默认添加的属性;你只能改变它的价值。这主要是因为您无法在匿名对象中设置空项,即为htmlAttributes
传递类似以下内容的内容会引发异常:
new { cols = null }
你唯一可以做的就是将它从匿名对象中删除,但是默认接管。你可以尝试做的一件事是:
new { cols = "" }
哪个应该生成
生成的HTML<textarea cols="" ...>
不确定这是否真的有效;你必须测试它。但是,我在我的项目中使用Bootstrap,我从来没有必要禁用cols
属性:它只是有效。您正在使用Bootstrap遇到什么问题,因为可能是可以修复的东西。
答案 1 :(得分:1)
对于它的价值,在最新版本的MVC(可能还有以前的版本)中,您可以将列和行设置为0
,而不会在html中呈现。
此:
@Html.TextAreaFor(m => m.Comments, 0, 0, new { @class="form-control" })
产生这个:
<textarea class="form-control" id="Comments" name="Comments"></textarea>
答案 2 :(得分:0)
您可以为TextAreaFor设置行和列属性,默认情况下它会添加cols = 20和rows = 2。也许您可以准确指定您想要的内容。比如这样的东西。
@Html.TextAreaFor(m => m.Commnets, new { @class = "whatever-class", @cols = 10 })
答案 3 :(得分:0)
不幸的是没有简单的解决方法(除非您可以考虑使用JavaScript DOM操作)...您需要创建自己的HtmlHelper类以在视图中使用...
将以下类添加到MVC项目中,并使用它...您的视图只需编写@this.Html.TextAreaHelperFor(...)
并使用与使用TextAreaFor
方法完全相同的方式,除非输出不包括任何col
或row
属性
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Web;
using global::System.Web.Mvc;
public static class TextAreaHelperExtension
{
public static MvcHtmlString TextAreaHelperFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
return TextAreaHelperFor(htmlHelper, expression, null);
}
public static MvcHtmlString TextAreaHelperFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
{
return TextAreaHelperFor(htmlHelper, expression, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}
public static MvcHtmlString TextAreaHelperFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
{
if (expression == null)
{
throw new ArgumentNullException("expression");
}
return TextAreaHelper(htmlHelper,
ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData),
ExpressionHelper.GetExpressionText(expression),
htmlAttributes);
}
internal static MvcHtmlString TextAreaHelper(HtmlHelper htmlHelper, ModelMetadata modelMetadata, string name, IDictionary<string, object> htmlAttributes, string innerHtmlPrefix = null)
{
string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
if (String.IsNullOrEmpty(fullName))
{
throw new ArgumentException();
}
TagBuilder tagBuilder = new TagBuilder("textarea");
tagBuilder.GenerateId(fullName);
tagBuilder.MergeAttributes(htmlAttributes, true);
tagBuilder.MergeAttribute("name", fullName, true);
ModelState modelState;
if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState) && modelState.Errors.Count > 0)
{
tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
}
tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, modelMetadata));
string value;
if (modelState != null && modelState.Value != null)
{
value = modelState.Value.AttemptedValue;
}
else if (modelMetadata.Model != null)
{
value = modelMetadata.Model.ToString();
}
else
{
value = String.Empty;
}
tagBuilder.InnerHtml = (innerHtmlPrefix ?? Environment.NewLine) + HttpUtility.HtmlEncode(value);
return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal);
}
internal static MvcHtmlString ToMvcHtmlString(this TagBuilder tagBuilder, TagRenderMode renderMode)
{
return new MvcHtmlString(tagBuilder.ToString(renderMode));
}
}