Asp.net mvc EditorTemplates和ViewData

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

我有很多表单都遵循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>
所以问题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"]})