使用TextAreaFor禁用cols

时间:2014-09-22 19:05:55

标签: c# html asp.net-mvc twitter-bootstrap

好的我正在使用带有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 })

4 个答案:

答案 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方法完全相同的方式,除非输出不包括任何colrow属性


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));
    }
}