9

我的观点中有以下两种类型的多行文本区域:

<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 还是应该在 or 中指定高度CSSwidth=500px, height=600px宽度400px

4

2 回答 2

16

您可以覆盖默认编辑器模板( ~/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>

您还可以增强编辑器模板,这样您就不需要在每个 EditorFor 调用中指定 @class 属性,如下所示:

@{
    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" })

哦,别忘了 id 在 HTML 中必须是唯一的,所以这id = "dialogText"对于第二个 textarea 显然应该是不同的。

于 2012-05-22T06:13:25.037 回答
3

您可以创建一个编辑器模板MultiLine1.cshtmlMultiLine2.cshtml并且在您的视图模型中,您可以使用UIHint它来指定要用于该特定属性的编辑器模板。但是您只能为一个属性指定一个模板。但是,在相同类型的不同属性上,您可以使用不同的模板。

于 2012-05-22T06:04:40.127 回答