使用@ Html.EditorForModel的限制

时间:2016-04-29 01:00:23

标签: css asp.net razor html-helper 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; }
    }

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

@Html.EditorForModel()

现在结果并非100%我所期待的: -

enter image description here

任何人都可以提出如何克服这些限制的建议: -

  1. 有没有办法将ResourceType字段作为drodownlist? 。现在,如果我渲染单独的字段,我可以使用@Html.DropDownlistFor ..但不确定在使用@Html.EditorForModel时我如何处理此问题?

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

    <div>
        <span class="f">@Html.DisplayNameFor(model => model.Resource.RESOURCENAME)</span> 
       @Html.EditorFor(model => model.Resource.RESOURCENAME) 
        @Html.ValidationMessageFor(model => model.Resource.RESOURCENAME)                                              
    </div>
    
  3. 我有标签&amp;在同一行的文本,我用class = f包装标签,它将以粗体显示标签。那么我可以修改EditorForModel生成的输出,使标签和文本框在同一行,而不是在2个单独的行上吗?

    1. 我可以强制EditorForModel呈现RESOURCECUSTOMFIELD列表列吗?

2 个答案:

答案 0 :(得分:6)

EditorForModel默认模板无法高度自定义。您应该编写 EditorTemplate 来解决所有问题。您可以查看tutorial。 您必须手动编写所有属性,但每个模型只能执行一次。将模板放在文件夹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 )
    }
    
  4. 并使用它(在您的主模板中):

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

    如果您想要更改DisplayFor对模型的工作方式,还有一些名为 DisplayTemplate 的内容。

答案 1 :(得分:2)

1.您可以在模型字段上方使用[UIHint(&#34; custom_template&#34;)]。 例如:

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; }
    }

然后你应该在Shared / EditorTemplates中创建gender_template.cshtml,如下图所示。

enter image description here

文件gender_template.cshtml中的示例代码。

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

然后在View页面代码中

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


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

运行视图页面后的结果是

enter image description here

您可以根据需要制作更多自定义模板。

  1. 你可以这样做@ html.EditorFor,要使用@ Html.DisplayFor语法,你应该在Shared / DisplayTemplates中创建模板文件,你可以在模板文件中编写/添加你自己的html语法。