Как создать несколько шаблонов редактора для многострочного текстового поля в MVC3?

В моих представлениях есть следующие два типа многострочных текстовых областей:

<textarea cols="100" rows="15" class="full-width" id="dialogText" 
          name="Text">@Model.Text</textarea>

<textarea cols="100" rows="10" class="full-width" id="dialogText" 
          name="Text">@Model.Text</textarea> 

Я хотел бы использовать пользовательские шаблоны шаблонов, но не могу указать атрибуты по-разному (например, rows отличаются друг от друга).

Можно ли объявить и использовать два разных типа шаблонов для одного и того же поля? Если да, то как мне объявить шаблон и как указать различные шаблоны для использования?

Также как я могу объявить разные столбцы и строки. Могу ли я использовать cols, rows или указать высоту и ширину в CSS, например width=500px, height=600px или 400px?

Ответ 1

Вы можете переопределить шаблон редактора по умолчанию (~/Views/Shared/EditorTemplates/MultilineText.cshtml):

@Html.TextArea(
    "", 
    ViewData.TemplateInfo.FormattedModelValue.ToString(),
    ViewData
)

а затем предположим, что вы определили модель представления:

public class MyViewModel
{
    [DataType(DataType.MultilineText)]
    public string Text { get; set; }
}

внутри основного вида вы можете сделать это:

@model MyViewModel

@Html.EditorFor(x => x.Text, new { cols = "100", rows = "15", id = "dialogText", @class = "full-width" })
@Html.EditorFor(x => x.Text, new { cols = "100", rows = "10", id = "dialogText", @class = "full-width" })

который отобразит ожидаемый результат:

<textarea class="full-width" cols="100" id="dialogText" name="Text" rows="15">
    hello world
</textarea>

<textarea class="full-width" cols="100" id="dialogText" name="Text" rows="10">
    hello world
</textarea>

Также вы можете улучшить шаблон редактора, чтобы вам не нужно указывать атрибут @class на каждом вызове EditorFor, например:

@{
    var htmlAttributes = ViewData;
    htmlAttributes["class"] = "full-width";

}
@Html.TextArea(
    "", 
    ViewData.TemplateInfo.FormattedModelValue.ToString(),
    htmlAttributes
) 

и теперь вы можете:

@model MyViewModel
@Html.EditorFor(x => x.Text, new { cols = "100", rows = "15", id = "dialogText" })
@Html.EditorFor(x => x.Text, new { cols = "100", rows = "10", id = "dialogText" })

О, и не забывайте, что идентификаторы должны быть уникальными в HTML, поэтому этот id = "dialogText", очевидно, будет отличаться для второго текстового поля.

Ответ 2

вы можете создать шаблон редактора MultiLine1.cshtml и MultiLine2.cshtml, а в вашей модели просмотра вы можете использовать UIHint, чтобы указать, какой шаблон редактора вы хотите использовать для этого конкретного свойства. Но вы можете указать только один шаблон для одного свойства. При разных свойствах одного и того же типа вы можете использовать разные шаблоны.