Asp.net mvc 标准化数据类型的复杂html视图的首选方法是什么?

Asp.net mvc 标准化数据类型的复杂html视图的首选方法是什么?,asp.net-mvc,html-helper,mvc-editor-templates,Asp.net Mvc,Html Helper,Mvc Editor Templates,我在许多MVC编辑视图中重复了这样的代码。此示例是我们显示复选框的默认方式,但在其他输入类型中也会发现类似的重复 <div class="form-group"> @Html.LabelFor(model => model.IsLive, htmlAttributes: new { @class = "control-label col-md-3" }) <div class="col-md-8 checkbox"> <div

我在许多MVC编辑视图中重复了这样的代码。此示例是我们显示复选框的默认方式,但在其他输入类型中也会发现类似的重复

<div class="form-group">
    @Html.LabelFor(model => model.IsLive, htmlAttributes: new { @class = "control-label col-md-3" })
    <div class="col-md-8 checkbox">
        <div class="col-xs-1">
            @Html.EditorFor(model => model.IsLive)
        </div>
        <div class="col-xs-10">
            @Html.CheckboxLabelFor(model => model.IsLive)
        </div>
    </div>
    <a class="infoonclick col-md-1" title="@Html.DisplayNameFor(model => model.IsLive)" data-content="@Html.DescriptionFor(model => model.IsLive)">
        <span class="fa fa-info-circle"></span>
    </a>
</div>

我有一个项目,我的大部分观点如下: (这也适用于多级深层复杂对象,但不适用于任何类型的集合,如IEnumerable,尽管可以修改以实现此目的)

我有一些编辑器模板:

\视图\Shared\EditorTemplates\multilitext.cshtml

@model对象
@{
var htmlAttributes=this.ViewData.ModelMetadata.GetHtmlAttributes();
}
@LabelFor(m=>m,新的{@class=“control label”})
@Html.TextAreaFor(
m=>m,
8, 8,
HTMLAT贡品)
@ValidationMessageFor(m=>m,null,new{@class=“help block”})
这一切都神奇地适用于object.cshtml的修改版本:

@model object

@using System.Text;
@using System.Data;

@{
  ViewDataDictionary viewData = Html.ViewContext.ViewData;
  TemplateInfo templateInfo = viewData.TemplateInfo;
  ModelMetadata modelMetadata = viewData.ModelMetadata;

  System.Text.StringBuilder builder = new StringBuilder();

  string result;

  // DDB #224751
  if (templateInfo.TemplateDepth > 2)
  {
     result = modelMetadata.Model == null ? modelMetadata.NullDisplayText
                                            : modelMetadata.SimpleDisplayText;
  }

  foreach (var prop in modelMetadata.Properties.Where(pm =>
     pm.ShowForEdit
        //&& pm.ModelType != typeof(System.Data.EntityState)
     && !templateInfo.Visited(pm)
     )
     .OrderBy(pm => pm.Order))
  {

     //Type modelType =  Model.GetType();
     Type modelType = modelMetadata.ModelType;
     System.Reflection.PropertyInfo pi = modelType.GetProperty(prop.PropertyName);
     System.ComponentModel.DataAnnotations.DisplayAttribute attribute = pi.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false).FirstOrDefault() as System.ComponentModel.DataAnnotations.DisplayAttribute;

     if (attribute != null
         && !string.IsNullOrWhiteSpace(attribute.GetGroupName()))
     {
        //builder.Append(string.Format("<div>{0}</div>", attribute.GetGroupName()));
        builder.Append(Html.Partial("Partial-GroupName", attribute.GetGroupName()));
     }

     builder.Append(Html.Editor(prop.PropertyName, prop.TemplateHint ?? prop.DataTypeName).ToHtmlString());
  }

  result = builder.ToString();
}
@Html.Raw(result)
@model对象
@使用系统文本;
@使用系统数据;
@{
ViewDataDictionary viewData=Html.ViewContext.viewData;
TemplateInfo TemplateInfo=viewData.TemplateInfo;
ModelMetadata ModelMetadata=viewData.ModelMetadata;
System.Text.StringBuilder=新的StringBuilder();
字符串结果;
//DDB#224751
如果(templateInfo.TemplateDepth>2)
{
结果=modelMetadata.Model==null?modelMetadata.NullDisplayText
:modelMetadata.SimpleDisplayText;
}
modelMetadata.Properties.Where(pm=>
ShowForEdit下午
//&&pm.ModelType!=typeof(System.Data.EntityState)
&&!templateInfo.已访问(下午)
)
.OrderBy(pm=>pm.Order))
{
//类型modelType=Model.GetType();
类型modelType=modelMetadata.modelType;
System.Reflection.PropertyInfo pi=modelType.GetProperty(prop.PropertyName);
System.ComponentModel.DataAnnotations.DisplayAttribute=pi.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute),false)。FirstOrDefault()作为System.ComponentModel.DataAnnotations.DisplayAttribute;
if(属性!=null)
&&!string.IsNullOrWhiteSpace(attribute.GetGroupName()))
{
//Append(string.Format(“{0}”,attribute.GetGroupName());
Append(Html.Partial(“Partial GroupName”,attribute.GetGroupName());
}
Append(Html.Editor(prop.PropertyName,prop.TemplateHint??prop.DataTypeName).ToHtmlString());
}
结果=builder.ToString();
}
@Html.Raw(结果)
示例输出:


我的EditFor模板是的版本(我与之没有关联)。

在模板中,您的模型是
bool
,因此它只需要
@Html.LabelFor(m=>m)
等。也不确定您为什么认为创建Html助手扩展方法是一个问题。给出了一个与您的输出非常接近的示例。啊,好的,这很有意义-谢谢。html帮助程序的问题在于,其中有太多可能发生更改的类。我觉得把这些硬编码到helper中是不对的。helper所做的就是模板所做的,但这意味着你可以将它编译成一个单独的dll,并在多个项目中重用它。这两种方法都有优点,这取决于您想做什么以及如何使用。当然,如果您希望灵活性能够更改诸如类名之类的属性,那么模板会更好。我还不足以将我的工作编译成DLL!我觉得那也很酷!感谢您提供的详细答案和代码示例,了解它们是如何结合在一起的对我非常有帮助。object.cshtml中被注释掉的部分是您从默认值中进行更改的部分吗?有些是,有些不是。它是经过几代修改的()。
<h3>Edit existing page</h3>

<div class="col-xs-12">
    @using (Html.BeginForm("Edit", "Page", FormMethod.Post, new { role = "role" }))
    {
      @Html.EditorForModel()
      <input type="submit" value="Save" class="btn btn-primary" />
    }
</div>
public class PageEditViewModel
{
    [Editable(false)]
    [DisplayName("Page Id")]
    public Guid Id { get; set; }

    [Editable(false)]
    [DisplayName("Url to resource (format: '/my-resource' or '/sub/resource)'")]
    public string Url { get; set; }

    [Required]
    [MaxLength(50, ErrorMessage = "Maximum Length of 50 Exceeded.")]
    [DisplayName("Title for page (must match Url ex: 'My Resource' or 'Sub Resource'")]
    public string PageTitle { get; set; }

    [MaxLength(int.MaxValue, ErrorMessage = "Content Exceeded Maximum Length")]
    [DataType(DataType.MultilineText)]
    public string Content { get; set; }
}
@model object
@{
  var htmlAttributes = this.ViewData.ModelMetadata.GetHtmlAttributes();
}

<div class="form-group @Html.ErrorClassFor(m => m, "has-error")">
    @Html.LabelFor(m => m, new { @class = "control-label" })
    <div class="controls">
        @Html.TextAreaFor(
            m => m,
            8, 8,
            htmlAttributes)
        @Html.ValidationMessageFor(m => m, null, new { @class = "help-block" })
    </div>
</div>
@model object

@using System.Text;
@using System.Data;

@{
  ViewDataDictionary viewData = Html.ViewContext.ViewData;
  TemplateInfo templateInfo = viewData.TemplateInfo;
  ModelMetadata modelMetadata = viewData.ModelMetadata;

  System.Text.StringBuilder builder = new StringBuilder();

  string result;

  // DDB #224751
  if (templateInfo.TemplateDepth > 2)
  {
     result = modelMetadata.Model == null ? modelMetadata.NullDisplayText
                                            : modelMetadata.SimpleDisplayText;
  }

  foreach (var prop in modelMetadata.Properties.Where(pm =>
     pm.ShowForEdit
        //&& pm.ModelType != typeof(System.Data.EntityState)
     && !templateInfo.Visited(pm)
     )
     .OrderBy(pm => pm.Order))
  {

     //Type modelType =  Model.GetType();
     Type modelType = modelMetadata.ModelType;
     System.Reflection.PropertyInfo pi = modelType.GetProperty(prop.PropertyName);
     System.ComponentModel.DataAnnotations.DisplayAttribute attribute = pi.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false).FirstOrDefault() as System.ComponentModel.DataAnnotations.DisplayAttribute;

     if (attribute != null
         && !string.IsNullOrWhiteSpace(attribute.GetGroupName()))
     {
        //builder.Append(string.Format("<div>{0}</div>", attribute.GetGroupName()));
        builder.Append(Html.Partial("Partial-GroupName", attribute.GetGroupName()));
     }

     builder.Append(Html.Editor(prop.PropertyName, prop.TemplateHint ?? prop.DataTypeName).ToHtmlString());
  }

  result = builder.ToString();
}
@Html.Raw(result)