如何创建考虑EF的DatabaseGenerated属性的自定义MvcView脚手架

时间:2015-04-17 16:56:17

标签: entity-framework asp.net-mvc-5 natural-key t4scaffolding

是的,我有一个项目,我正在使用我的EF 6.x实体,就像它们也是我的ViewModel一样 - 对我来说没有AutoMap - 我已经研究并了解风险。

我的数据库有很多自然键。在我的Code First POCO中,我的属性看起来像这样:

Partial Public Class ProfilePriceGroup

    <Key> <DatabaseGenerated(DatabaseGeneratedOption.None)>
    Public Property ProfileId As Long

    Public Property TargetRegion As String

    Public Property Discount As Decimal = 0D

End Class

我正在尝试编辑脚手架模板(我的项目通过SideWaffle VSIX提供'CodeTemplates'目录),我特意尝试影响默认情况下为MvcView / Edit.vb.t4生成的剃刀

由于密钥是反映模型绑定器的重要信息,因此默认支架呈现隐藏的输入,但是,如果它是DatabaseGeneratedOption.None - 我希望它会呈现一个额外的可见标签,以便用户可以理解他们正在编辑什么'ProfileId'。

换句话说,默认的脚手架假设代理键在视图中是不感兴趣的,但是,我的键对我的观点很有意思。

我对&lt; HiddenInput(DisplayValue:= True)&gt;不感兴趣DataAnnotation是System.Web.Mvc命名空间的一部分,用于实现此目的。我确实想让我的EF项目暂时没有MVC库。

我可以很容易地看到当前的MVC脚手架如何从传入的ModelMetadata参数迭代PropertyMetadata类型,该参数是一种类型的Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata

但是,我如何跨越并获取此DatabaseGenerated属性,我认为该属性派生自System.Data.Metadata.Edm命名空间?

1 个答案:

答案 0 :(得分:0)

在这里,您可以看到我的Edit.vb.t4模板生成的脚手架片段:

@Using (Html.BeginForm())
    @Html.AntiForgeryToken()

    @<div class="form-horizontal">
    <h4><#= ConvertCamelCaseStr(ViewDataTypeShortName) #></h4>
    <hr />
    @Html.ValidationSummary(true)
<#
For Each modelProperty As PropertyMetadata in ModelMetadata.Properties
    If (modelProperty.Scaffold) AndAlso (Not modelProperty.IsAssociation) Then
    If (modelProperty.IsPrimaryKey) Then
            If (modelProperty.IsAutoGenerated) Then
#>
    @Html.HiddenFor(Function(model) model.<#= modelProperty.PropertyName #>)
<#
            Else
#>
        <!-- natural key - we will show the value and a hidden input -->
        <div class="form-group">
            @Html.LabelFor(Function(model) model.<#= modelProperty.PropertyName #>, New With { .class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DisplayFor(Function(model) model.<#= modelProperty.PropertyName #>)
                @Html.HiddenFor(Function(model) model.<#= modelProperty.PropertyName #>)
            </div>
        </div>
<#
            End If
    ElseIf (Not modelProperty.IsReadOnly)
#>

使我的脚手架工作的部分是If (modelProperty.IsAutoGenerated) Then件......我的特殊内容在Else中,与OOTB T4 MVC 5 / EntityFramework模板不同