Asp.net mvc 标准化数据类型的复杂html视图的首选方法是什么?
我在许多MVC编辑视图中重复了这样的代码。此示例是我们显示复选框的默认方式,但在其他输入类型中也会发现类似的重复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
<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)