2014-09-22 2 views
0

OK Я использую MVC 4 с Bootstrap и сталкиваюсь с проблемой с TextAreaFor и столбцами. По умолчанию, если вы не устанавливаете col/row, система по умолчанию использует 2/10. Очевидно, что если вы введете строку/col, она будет использовать это. Проблема в том, что формы, использующие Bootstraper, лучше, если вы просто оставите его пустым. Любой придумал хороший способ отключить col для TextAreaFor.Отключить cols с TextAreaFor

@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> 

Edited - Ну хорошо, я создал собственный шаблон редактора как такового:

@{ 
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

Есть строки и столбца атрибутов, которые вы можете установить для TextAreaFor и, похоже, по умолчанию это добавляет cols = 20 и rows = 2. Возможно, вы можете точно указать, что хотите. Что-то вроде этого, например.

@Html.TextAreaFor(m => m.Commnets, new { @class = "whatever-class", @cols = 10 }) 
1

К сожалению, нет, вы не можете отключить атрибут, добавляемый по умолчанию помощником; вы можете изменить его значение. В основном это связано с тем, что вы не можете установить нулевые элементы в анонимный объект, т.е. передавая что-то вроде следующего за htmlAttributes вызовет исключение:

new { cols = null } 

Единственное, что вы можете сделать, это оставить его из анонимного объекта, но затем используется по умолчанию. Одна вещь, вы можете попробовать это делает:

new { cols = "" } 

Который должен привести к сгенерированной HTML из

<textarea cols="" ...> 

Не уверен, если это действительно будет работать, хотя; вам придется протестировать его. Тем не менее, я использую Bootstrap в своих проектах, и мне никогда не приходилось отключать атрибут cols: он просто работает. Какую проблему вы испытываете именно с помощью Bootstrap, потому что возможно это то, что может быть исправлено .

+0

Когда атрибут цв нет Bootstrap устанавливает текстовую область на 100% от деления, в котором он находится. Очевидно, когда col установлен, это та ширина, поэтому, если он формирует размер изменения, окно выглядит слишком маленьким или больше, чем экран. Я пытаюсь установить все свои формы для использования размеров xs/sm/md на основе размера браузера. –

+1

Это моя точка: стили Bootstrap переопределяют атрибут, потому что они устанавливают явную ширину для текстового поля. Если этого не происходит, то стили Bootstrap каким-то образом воспитываются. Предполагая, что в textarea есть необходимый класс «form-control», ширина должна быть 100% от контейнера, независимо от того, какой набор «cols» установлен или если он вообще установлен. –

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)); 
    } 
} 
Смежные вопросы