使用@ Html.EditorForModel的限制

joh*_* Gu 16 css asp.net html-helper razor asp.net-mvc-5

我正在开发一个asp.net mvc-5 Web应用程序.我有以下模特课: -

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; }
    }
Run Code Online (Sandbox Code Playgroud)

现在我通常在现场使用@Html.EditorFor()&LabelFor().但对于这个模型我想开始使用,@Html.EditorForModel因为我将在视图上有更少的标记: -

@Html.EditorForModel()
Run Code Online (Sandbox Code Playgroud)

现在结果不是100%我所期待的: -

在此输入图像描述

任何人都可以如何克服这些限制: -

  1. 有没有办法将ResourceType字段作为drodownlist?.现在,如果我渲染单独的字段,我可以使用@Html.DropDownlistFor..但不知道如何使用时我可以处理这个@Html.EditorForModel

  2. 有没有办法修改生成的布局?,,现在通常我的应用程序我有标签的以下布局 - >文本框: -

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

我在同一行有标签和文字,我用class = f包装标签,这将以粗体显示标签.那么我可以修改生成的输出,使EditorForModel标签和文本框在同一行,而不是在2个单独的行上?

  1. 我能够强制EditorForModel呈现RESOURCECUSTOMFIELD列表列吗?

Gök*_*urt 6

EditorForModel默认模板不是高度可自定义的.您应该编写一个EditorTemplate来解决所有问题.您可以查看本教程.您必须手动编写所有属性,但每个模型只能执行一次.将模板放在文件夹中EditorTemplates/,整个应用程序都可以使用它.要回答你的子弹:

  1. 现在您编写自己的模板,您可以为您的属性使用任何类型的输入.默认的编辑器string类型是一个文本框(下拉enum类型).

  2. 您必须在模板中编写自己的布局.这正是你想要的.

  3. 您还可以编写编辑器模板RESOURCECUSTOMFIELD并在模板中使用它.您甚至可以为IEnumerable<RESOURCECUSTOMFIELD>以下内容编写模板:

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

并使用它(在您的主模板中):

   @Html.EditorFor(m => m.RESOURCECUSTOMFIELD )
Run Code Online (Sandbox Code Playgroud)

如果您想要更改模型的工作方式,还有一些名为DisplayTemplate的东西DisplayFor.