我有很多表格遵循标签的通用格式:控制。我决定不再有以下几页:
<div class="row-fluid">
<div class="span4">
@Html.LabelFor(m => m.Prop1)
</div>
<div class="span8">
@Html.TextBoxFor(m => m.Prop1)
</div>
</div>我将创建一个编辑器模板来保存此模式,并选择正确的默认控件。当然,一位队友立即指出,硬编码跨域是没有帮助的,所以我添加了一些定制的ViewData字段,比如"labelSpan“。
真正的问题在于:
@Html.TextBoxFor(m => m, new { @class = @ViewData["class"], style = @ViewData["style"],
id = @ViewData["id"]... etc })那么,问题1:我如何巩固这个直接通过而不必指定每一个属性?
问题2:我如何做到以下几点不相冲突?
@Html.LabelFor(m => m, new { @class = @ViewData["LabelClass"], style = @ViewData["LabelStyle"] })发布于 2014-06-17 18:00:14
与其使用ViewData,不如使用ModelMetadata。如果创建自定义ModelMetadataProvider,则可以重写CreateMetadata方法以向AdditionalAttributes添加适当的值,然后可以查询这些值。
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes,
Type containerType, Func<object> modelAccessor,
Type modelType, string propertyName)
{
var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
var labelSpan = "span4"; // do whatever logic you need to.
metadata.AdditionalValues.Add("labelSpan", labelSpan);
...
return metadata;
}然后使用编辑器模板中的元数据。我发现的模式是只将标签放在Object.cshtml编辑器模板中:
@{
var visibleProperties = ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm)).ToList();
var noHtmlProps = visibleProperties.Where(pm => pm.HideSurroundingHtml).ToList();
var normalProperties = visibleProperties.Where(pm => !pm.HideSurroundingHtml).ToList();
foreach (var prop in normalProperties)
{
<div class="row-fluid">
@Html.Label(prop.PropertyName, prop.DisplayName,
new{@class=ViewData.ModelMetadata.AdditionalValues["labelSpan"]})
@(prop.IsReadOnly
? Html.Display(prop.PropertyName)
: Html.Editor(prop.PropertyName))
@Html.ValidationMessage(prop.PropertyName)
</div>
}
// Output hidden properties at the end
foreach (var prop in noHtmlProps)
{
@Html.Editor(prop.PropertyName)
}
}然后使用其他类型的编辑器模板来确定要使用的控件。例如,String.cshtml可能如下所示:
@Html.TextBox(string.Empty, ViewData.TemplateInfo.FormattedModelValue,
new{@class = ViewData.ModelMetadata.AdditionalValues["valueSpan"]})https://stackoverflow.com/questions/24269943
复制相似问题