我正在寻找有关自定义MVC3编辑器模板的高级资源

时间:2012-03-28 04:43:00

标签: asp.net-mvc asp.net-mvc-3 razor

我一直在努力定制EditorForModel以及我的代码和内置MVC3助手发出的HTML元素的命名。我的代码非常简单,显然缺少一些细微之处,比如正确命名渲染元素。

我正在寻找可以帮助我磨练当前开发领域的高级资源,特别是为了将主视图模型细分为较小的子模型,以便我可以应用三个EditorForModel个调用在一个视图中,将生成的模型编辑器拆分为表单列或标签页。

我当前对默认EditorForModel模板的“覆盖”如下:

@{
    // TODO Filtering for subsets of model without having to bind separate models.
        var properties = ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !pm.IsComplexType && !ViewData.TemplateInfo.Visited(pm));
    }
<fieldset>
    <legend>@ViewData.ModelMetadata.DisplayName</legend>
    <ul class="form-column">
        @foreach (var prop in properties)
        {
            <li>
                    @{
            if (prop.HideSurroundingHtml)
            {
                        @Html.Editor(prop.DisplayName ?? prop.PropertyName)
            }
            else
            {
                        @Html.Label(prop.PropertyName, (prop.IsRequired ? "* " : "") + (prop.DisplayName ?? prop.PropertyName))
                        @Html.Editor(prop.PropertyName)
            }
                    }
            </li>
        }
    </ul>
</fieldset>

我已在this article Brad Wilson's blog上的Object.ascx示例模板中复制并修改了此代码。我可以通过尽可能多的方式来咨询哪些资源以丰富这些资源以满足尽可能多的场景?

1 个答案:

答案 0 :(得分:1)

您的模板似乎非常适合非常通用的编辑器。如果我理解您的问题,您正在寻找更多方法来分解和过滤您的模型属性。

将模型过滤到子集而不必创建子模型的一种方法是使用属性。您可以根据需要创建任意数量的属性,并让它们实现IMetadataAware。在那里,您可以向ModelMetadata.AdditionalValues属性包添加任意属性,并让编辑器模板检查这些值。

或者,您可以实现自己的自定义ModelMetadataProvider,该自定义ModelMetadata返回具有您想要的任何属性的自定义{{1}}对象。

要么允许您简单地注释模型以定义过滤器行为。

这两种方法都由其他人描述,Brad Wilson,在blog post.