Мне кажется, что я предпочитаю свои взгляды просто Позвонить Html.EditorFor (...) . Это означает, что шаблоны «Редактор» и «Отображение» определяют судьбу элементов управления в моем представлении, так что мой код представления сильно очищается - у него просто есть html и общие запросы для редакторов.
Следующая ссылка дает рабочий пример получения этой работы в Редакторе шаблонов
https://jefferytay.wordpress.com/2011/12/20/asp-net-mvc-string-editor-template-which-handles-the-stringlength-attribute/
Я использую подобное в моем String.cshtml шаблоне редактора (входит в Shared / EditorTemplates ).
@model object
@using System.ComponentModel.DataAnnotations
@{
ModelMetadata meta = ViewData.ModelMetadata;
Type tModel = meta.ContainerType.GetProperty(meta.PropertyName).PropertyType;
}
@if(typeof(string).IsAssignableFrom(tModel)) {
var htmlOptions = new System.Collections.Generic.Dictionary<string, object>();
var stringLengthAttribute = (StringLengthAttributeAdapter)ViewData.ModelMetadata.GetValidators(this.ViewContext.Controller.ControllerContext).Where(v => v is StringLengthAttributeAdapter).FirstOrDefault();
if (stringLengthAttribute != null && stringLengthAttribute.GetClientValidationRules().First().ValidationParameters["max"] != null)
{
int maxLength = (int)stringLengthAttribute.GetClientValidationRules().First().ValidationParameters["max"];
htmlOptions.Add("maxlength", maxLength);
if (maxLength < 20)
{
htmlOptions.Add("size", maxLength);
}
}
htmlOptions.Add("class", "regular-field");
<text>
@Html.TextBoxFor(m => m, htmlOptions)
</text>
}
else if(typeof(Enum).IsAssignableFrom(tModel)) {
//Show a Drop down for an enum using:
//Enum.GetValues(tModel)
//This is beyond this article
}
//Do other things for other types...
Тогда моя модель снабжена комментариями, такими как:
[Display(Name = "Some Field", Description = "Description of Some Field")]
[StringLength(maximumLength: 40, ErrorMessage = "{0} max length {1}.")]
public string someField{ get; set; }
А мой Вид просто звонит:
<div class="editor-label">
@Html.LabelWithTooltipFor(model => model.something.someField)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.something.someField)
@Html.ValidationMessageFor(model => model.something.someField)
</div>
Вы также можете заметить, что мой шаблон редактора String.cshtml также автоматически обрабатывает Enum, но это начинает отступать от текущей темы, поэтому я отменил этот код, просто скажу, что шаблон редактора строк потяните лишний вес, и, вероятно, Google имеет что-то на это https://www.google.com/search?q=string+editor+template+enum
Label With Tooltip For - это специальный HTML-помощник, который просто перетаскивает описание в заголовок метки для получения дополнительной информации о наведении указателя мыши на каждую метку.
Я бы порекомендовал этот подход, если вы хотите сделать это в шаблоне редактора .