2012-04-18 11 views
3

現在、Viewで次のコードを使用してHtml.TextAreaFor()のコンテンツのサイズを調整しています。これを行うにはそれほど冗長な方法がありますか?見栄えMVC3、Razor、Html.TextAreaFor():コンテンツに合わせて高さを調整します

... 
     int width = 85; 
     int lines = 1; 
     string[] arr = Model.Text.Split(new string[] {"\r\n", "\n", "\r"}, StringSplitOptions.None); 
     foreach (var str in arr) 
     { 
      if (str.Length/width > 0) 
      { 
       lines += str.Length/width + (str.Length % width <= width/2 ? 1 : 0); 
      } 
      else 
      { 
       lines++; 
      } 
     } 
     @Html.TextAreaFor(m => m.Text, 
          new 
          { 
           id = "text", 
           style = "width:" + width + "em; height:" + lines + "em;" 
          }) 
... 

答えて

4

コードは正常です。一つの可能​​な改善は、ビューを汚染を避けるために、再利用可能なヘルパーにそれを外部化するために、次のようになります。

public static class TextAreaExtensions 
{ 
    public static IHtmlString TextAreaAutoSizeFor<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression, 
     object htmlAttributes 
    ) 
    { 
     var model = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model; 
     var text = model as string ?? string.Empty; 
     int width = 85; 
     int lines = 1; 
     string[] arr = text.Split(new string[] { "\r\n", "\n", "\r" }, StringSplitOptions.None); 
     foreach (var str in arr) 
     { 
      if (str.Length/width > 0) 
      { 
       lines += str.Length/width + (str.Length % width <= width/2 ? 1 : 0); 
      } 
      else 
      { 
       lines++; 
      } 
     } 
     var attributes = new RouteValueDictionary(htmlAttributes); 
     attributes["style"] = string.Format("width:{0}em; height:{1}em;", width, lines); 
     return htmlHelper.TextAreaFor(expression, attributes); 
    } 
} 

とビューで:

@Html.TextAreaAutoSizeFor(m => m.Text, new { id = "text" }) 
+0

ニースオプションDarin – Har

+0

再利用可能で、メンテナンスが容易になり、ビューが曖昧になり、魅力的に機能します! usingディレクティブを追加するだけでした。using System.Web.Routing; using System.Web.Mvc; using System.Web.Mvc.Html; System.Linq.Expressionsを使用している 。 – Handprint

3

、 あなたもJQuery autogrow textarea pluginを使用することができます。

これはコードを保存し、さらに効率的になる場合があります。

+0

素晴らしいプラグイン。この回答とDarin Dimitrov'sの間で引き裂かれた!私が必要とするよりもはるかに魅力的なビットかもしれない。 – Handprint

2

あなたは、いくつかのLINQの魔法で1行にこれを減らすことができます:あなたが分割している途中でおしっこ問題があることを

var lines = Model.Text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None) 
    .Aggregate(0, (total, next) => 
    total += next.Length <= width ? 1 
     : (int)Math.Ceiling((double)next.Length/width)); 

注意を。 \n\r\r\nの行末が実際に入力されている場合(ほとんどありません)、この分割は左から右の順に分割されますので、文字列\r\nで分割されることはありません。 \rおよび\n。だから私は\r\nを分割の最初の文字列として移動したことがわかります。

+0

あなたはそうです。私は答えでこの問題を修正しました。いいキャッチ! –

+0

修正していただきありがとうございます。コンパクトで機能します! Darinの答えと一緒に使用しました。 – Handprint

関連する問題