4

現在、ビューで次のコードを使用して、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

3 に答える 3

5

コードは問題ないようです。考えられる改善の 1 つは、ビューの汚染を避けるために再利用可能なヘルパーに外部化することです。

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" })
于 2012-04-18T21:01:30.027 に答える
3

JQuery autogrow textarea pluginを使用することもできます。

コーディングを節約でき、さらに効率的です。

于 2012-04-18T20:46:47.023 に答える
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

于 2012-04-18T21:01:28.213 に答える