Ограничения использования @Html.EditorForModel

Я работаю над веб-приложением asp.net mvc-5. У меня есть следующий класс модели: -

public class Details4
    {
        [HiddenInput(DisplayValue=false)]
        public string RESOURCENAME { set; get; }
        [Display (Name="Account Name")]
        [Required]
        public string ACCOUNTNAME { set; get; }
        [Display(Name = "Resource type")]
        [Required]
        public string RESOURCETYPE { set; get; }
        [DataType(DataType.Password)]
        [Required]
        public string PASSWORD { set; get; }
        [Display(Name = "Description")]
        [DataType(DataType.MultilineText)]
        public string Description { set; get; }
        [Display(Name= "URL")]
        [Url]
        public string RESOURCEURL { set; get; }
        [Display(Name="Owner Name")]
        [Required]
        public string OWNERNAME { set; get; }
        [Display(Name = "Resource Group Nam")]
        public string RESOURCEGROUPNAME { set; get; }
        [JsonProperty("Domain")]
        public string DomainName { set; get; }
        [JsonProperty("DNSNAME")]
        public string DNSNAME { set; get; }
         [Display(Name = "Department")]
        public string DEPARTMENT { set; get; }
         [Display(Name = "Location")]
        public string LOCATION { set; get; }
        public List<RESOURCECUSTOMFIELD> RESOURCECUSTOMFIELD { set; get; }
    }

 public class RESOURCECUSTOMFIELD
    {
        public string CUSTOMLABEL { set; get; }
        public string CUSTOMVALUE { set; get; }
    }

теперь я обычно использую @Html.EditorFor() и LabelFor() на уровне поля. но для этой модели я хотел начать использовать @Html.EditorForModel, поскольку у меня будет меньше разметки на виде: -

@Html.EditorForModel()

теперь результат этого не был на 100% ожидаемым: -

введите описание изображения здесь

так может ли кто-нибудь советовать, как я могу преодолеть эти ограничения: -

  • Есть ли способ иметь поле ResourceType в виде списка обращений?, теперь, если я обрабатываю отдельные поля, я могу использовать @Html.DropDownlistFor.. но не уверен, как я могу справиться с этим при использовании @Html.EditorForModel?

  • Есть ли способ изменить сгенерированный макет?, теперь обычный во всем моем приложении у меня есть следующий макет для ярлыка → текстовое поле: -

    <div>
        <span class="f">@Html.DisplayNameFor(model => model.Resource.RESOURCENAME)</span> 
       @Html.EditorFor(model => model.Resource.RESOURCENAME) 
        @Html.ValidationMessageFor(model => model.Resource.RESOURCENAME)                                              
    </div>
    

где у меня есть метка и текст в той же строке, и я обернуваю метку классом = f, который отобразит метку жирным шрифтом. поэтому я могу изменить сгенерированный вывод из EditorForModel, чтобы иметь метку и текстовое поле в одной строке, вместо того, чтобы быть на двух отдельных строках?

  1. Могу ли я заставить редактор ForModel отображать столбцы RESOURCECUSTOMFIELD?

Ответы

Ответ 1

EditorForModel шаблон по умолчанию не настраивается. Вы должны написать EditorTemplate, чтобы решить все ваши проблемы. Вы можете проверить этот учебник. Вам нужно будет написать все свойства вручную, но вы будете делать это только один раз для каждой модели. Поместите шаблон в папку EditorTemplates/, и ваше приложение сможет его использовать. Чтобы ответить на ваши пули:

  • Теперь вы пишете свой собственный шаблон, вы можете использовать любой тип ввода для своих свойств. Редактором по умолчанию для типа string является текстовое поле (выпадающее меню для enum).

  • Вам нужно будет написать свой собственный макет в шаблоне. Это именно то, что вы хотите.

  • Вы также можете написать шаблон редактора для RESOURCECUSTOMFIELD и использовать его в своем шаблоне. Вы можете написать шаблон даже для IEnumerable<RESOURCECUSTOMFIELD>:

    @model IEnumerable<RESOURCECUSTOMFIELD>
    @foreach(var customModel in Model)
    {
        @Html.LabelFor(m => customModel.CUSTOMLABEL )
        @Html.TextBoxFor(m => customModel.CUSTOMVALUE )
    }
    

И используйте его как (в вашем основном шаблоне):

   @Html.EditorFor(m => m.RESOURCECUSTOMFIELD )

Существует также что-то, что называется DisplayTemplate, если вы хотите изменить способ работы DisplayFor для модели.

Ответ 2

1. Вы можете использовать [UIHint ( "custom_template" )] над полем модели. Например:

public class Class1
    {
        public int id { get; set; }
        public string Name { get; set; }
        public string LastName { get; set; }

        [UIHint("gender_template")]
        public string Gender { get; set; }
    }

Затем вы должны создать gender_template.cshtml в Shared/EditorTemplates, как показано на рисунке ниже.

введите описание изображения здесь

пример кода в файле gender_template.cshtml.

@Html.DropDownList(
    "",
    new SelectList(
        new[] 
        { 
            new { Value = "Male", Text = "Male" },
            new { Value = "Female", Text = "Female" },
        },
        "Value",
        "Text",
        Model
    )
)

Затем в коде страницы просмотра

@model MvcApplication2.Models.Class1 
@{
    ViewBag.Title = "Index";
}


<h2>Index</h2>
@Html.EditorForModel()

Результат после просмотра страницы просмотра

введите описание изображения здесь

Вы можете сделать больше настраиваемого шаблона, как вам нужно.

  1. Вы можете сделать так: @html.EditorFor, Чтобы использовать синтаксис @Html.DisplayFor, вы должны создать файл шаблона в Shared/DisplayTemplates, вы можете написать/добавить свой собственный синтаксис html в файл шаблона.