如何创建考虑 EF 的 DatabaseGenerated 属性的自定义 MvcView 脚手架
How to create custom MvcView scaffold that considers EF's DatabaseGenerated attribute
是的,我有一个项目,我正在使用我的 EF 6.x 实体,就好像它们也是我的 ViewModels - 我没有 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' 他们正在编辑的内容。
换句话说,默认脚手架假定代理键在视图中不感兴趣,但是,我的键对我的视图很有趣。
我对 DataAnnotation 不感兴趣,它是实现此目的的 System.Web.Mvc 命名空间的一部分。我确实想让我的 EF 项目暂时不受 MVC 库的影响。
我可以很容易地看到当前的 MVC 脚手架如何从传入的 ModelMetadata 参数迭代 PropertyMetadata 的类型,该参数是一种 Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata
但是,我如何交叉获取这个 DatabaseGenerated 属性,我认为它源自 System.Data.Metadata.Edm 命名空间?
在这里您可以看到我的 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 模板不同
是的,我有一个项目,我正在使用我的 EF 6.x 实体,就好像它们也是我的 ViewModels - 我没有 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' 他们正在编辑的内容。
换句话说,默认脚手架假定代理键在视图中不感兴趣,但是,我的键对我的视图很有趣。
我对
我可以很容易地看到当前的 MVC 脚手架如何从传入的 ModelMetadata 参数迭代 PropertyMetadata 的类型,该参数是一种 Microsoft.AspNet.Scaffolding.Core.Metadata.ModelMetadata
但是,我如何交叉获取这个 DatabaseGenerated 属性,我认为它源自 System.Data.Metadata.Edm 命名空间?
在这里您可以看到我的 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 模板不同