Asp.net mvc EditorTemplates和ViewData
我有很多表单都遵循Label:Control的通用格式。我决定不使用以下页面:Asp.net mvc EditorTemplates和ViewData,asp.net-mvc,mvc-editor-templates,Asp.net Mvc,Mvc Editor Templates,我有很多表单都遵循Label:Control的通用格式。我决定不使用以下页面: <div class="row-fluid"> <div class="span4"> @Html.LabelFor(m => m.Prop1) </div> <div class="span8"> @Html.TextBoxFor(m => m.Prop1) </div> <
<div class="row-fluid">
<div class="span4">
@Html.LabelFor(m => m.Prop1)
</div>
<div class="span8">
@Html.TextBoxFor(m => m.Prop1)
</div>
</div>
所以问题1:我如何合并它以直接通过而不必指定每个属性
问题2:我如何做到以下几点不冲突
@Html.LabelFor(m => m, new { @class = @ViewData["LabelClass"], style = @ViewData["LabelStyle"] })
您需要使用
ModelMetadata
,而不是使用ViewData
。如果创建自定义的modelmataprovider
,则可以重写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;
}
然后使用其他类型的编辑器模板确定要使用的控件。例如,String.cshtml
可能如下所示:
@Html.TextBox(string.Empty, ViewData.TemplateInfo.FormattedModelValue,
new{@class = ViewData.ModelMetadata.AdditionalValues["valueSpan"]})
@{
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)
}
}
@Html.TextBox(string.Empty, ViewData.TemplateInfo.FormattedModelValue,
new{@class = ViewData.ModelMetadata.AdditionalValues["valueSpan"]})