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

Pro*_*ofK 7 asp.net-mvc razor asp.net-mvc-3

我一直在努力解决我的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>
Run Code Online (Sandbox Code Playgroud)

我已经在Brad Wilson博客上的本文中从Object.ascx示例模板中复制并修改了此代码.我可以咨询哪些资源以尽可能丰富的方式来丰富这些资源以满足尽可能多的场景?

bha*_*lin 1

对于一个非常通用的编辑器来说,您的模板似乎相当不错。如果我正确理解您的问题,您正在寻找更多方法来分解和过滤模型属性。

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

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

两者都允许您简单地注释模型来定义过滤器行为。

Brad Wilson 在这篇博文中描述了这两种方法。