首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EditorTemplates和ViewData

EditorTemplates和ViewData
EN

Stack Overflow用户
提问于 2014-06-17 17:29:47
回答 1查看 440关注 0票数 2

我有很多表格遵循标签的通用格式:控制。我决定不再有以下几页:

代码语言:javascript
复制
<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“。

真正的问题在于:

代码语言:javascript
复制
 @Html.TextBoxFor(m => m, new { @class = @ViewData["class"], style = @ViewData["style"], 
id = @ViewData["id"]... etc })

那么,问题1:我如何巩固这个直接通过而不必指定每一个属性?

问题2:我如何做到以下几点不相冲突?

代码语言:javascript
复制
@Html.LabelFor(m => m, new { @class = @ViewData["LabelClass"], style = @ViewData["LabelStyle"] })
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-17 18:00:14

与其使用ViewData,不如使用ModelMetadata。如果创建自定义ModelMetadataProvider,则可以重写CreateMetadata方法以向AdditionalAttributes添加适当的值,然后可以查询这些值。

代码语言:javascript
复制
    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编辑器模板中:

代码语言:javascript
复制
@{
    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可能如下所示:

代码语言:javascript
复制
@Html.TextBox(string.Empty, ViewData.TemplateInfo.FormattedModelValue,
    new{@class = ViewData.ModelMetadata.AdditionalValues["valueSpan"]})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24269943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档