这是制作编辑器模板的正确方法吗?
Is this the correct way to do an Editor Template?
我想知道我是否正确地制作了编辑器模板。如果我做错了,你能给我指出正确的方向来正确地做吗?
我的文本区域编辑器模板:
@modeltype IEnumerable(Of be_PostTag)
@code
If Model Is Nothing Then
@Html.TextArea("PostTags")
Else
Dim sb As New StringBuilder
For Each x In Model
Dim tags = x.Tag & IIf(x.Equals(Model.Last), "", ", ")
sb.Append(tags)
Next
@Html.TextArea("PostTags", sb.ToString, 10, 50, Nothing)
End If
End Code
编辑: 我在 SO 上看到各种 post 建议使用 TextAreaFor 助手而不是非 For 控件,以便可以利用模型绑定。但是当我尝试使用 TextAreFor 时,VS2013 抱怨它不可访问。我需要 post 将 PostTags 返回服务器,并在创建或编辑 post 时将它们保存到数据库。希望这可以帮助。
使用 Html.*For
样式助手的指导是为了让您可以保持强类型。如果您使用 Html.TextBox("Foo")
之类的东西,然后删除或更改 Foo
属性 的名称,视图将愉快地继续呈现 Foo
的输入,无论如何。但是,如果您使用 Html.TextBoxFor(Function(x) x.Foo)
,那么 Intellisense 会告诉您有问题。
然而,For
帮助器往往不能很好地与编辑器模板配合使用,这仅仅是因为 "model" 的上下文在编辑器模板中发生了变化。您现在只使用 属性,而不是视图的完整模型。这里实际上最好使用非 For
帮助器并传递一个空字符串作为 属性 名称,即:
@Html.TextBox("")
Razor 会根据上下文为您填充正确的值。
不过,在您这里的特定情况下。编辑器模板是一个糟糕的选择。首先,它们并不是真的要与枚举竞争。您可以在可枚举对象上使用 Html.EditorFor
,但它真正做的是检查内部类型并为可枚举对象中的每一项呈现该类型的编辑器模板,而不是为整个可枚举对象呈现一个模板 属性,本身。此外,正如 Stephen Muecke 在评论中指出的那样,最好先组合字符串,然后将该组合字符串传递给您的视图。这是视图模型派上用场的地方,因为您可以创建如下内容:
Public Class FooViewModel
Public Property Tags As IEnumerable(Of be_PostTag)
Public Property TagsAsString As String
Get
Return String.Join(",", Tags.Select(Function(x) x.Tag))
End Get
Set(ByVal Value As String)
Tags = Value.Split(",").Select(Function(x) New be_PostTag With { .Tag = x })
End Set
End Property
End Class
那么,在您看来:
@Html.TextBoxFor(Function (x) x.TagsAsString)
一些注意事项。我是一个 C# 人,所以对这段代码持保留态度。就其价值而言,VB.NET 的受欢迎程度正在迅速下降,与 ASP.NET MVC 结合使用时更是如此。对于您自己的启发,我建议您选择 C#,尤其是当您遇到问题时,您会找到更好、更有用的答案,因为 ASP.NET MVC C# 开发人员可以为您提供帮助 多大。
我想知道我是否正确地制作了编辑器模板。如果我做错了,你能给我指出正确的方向来正确地做吗?
我的文本区域编辑器模板:
@modeltype IEnumerable(Of be_PostTag)
@code
If Model Is Nothing Then
@Html.TextArea("PostTags")
Else
Dim sb As New StringBuilder
For Each x In Model
Dim tags = x.Tag & IIf(x.Equals(Model.Last), "", ", ")
sb.Append(tags)
Next
@Html.TextArea("PostTags", sb.ToString, 10, 50, Nothing)
End If
End Code
编辑: 我在 SO 上看到各种 post 建议使用 TextAreaFor 助手而不是非 For 控件,以便可以利用模型绑定。但是当我尝试使用 TextAreFor 时,VS2013 抱怨它不可访问。我需要 post 将 PostTags 返回服务器,并在创建或编辑 post 时将它们保存到数据库。希望这可以帮助。
使用 Html.*For
样式助手的指导是为了让您可以保持强类型。如果您使用 Html.TextBox("Foo")
之类的东西,然后删除或更改 Foo
属性 的名称,视图将愉快地继续呈现 Foo
的输入,无论如何。但是,如果您使用 Html.TextBoxFor(Function(x) x.Foo)
,那么 Intellisense 会告诉您有问题。
然而,For
帮助器往往不能很好地与编辑器模板配合使用,这仅仅是因为 "model" 的上下文在编辑器模板中发生了变化。您现在只使用 属性,而不是视图的完整模型。这里实际上最好使用非 For
帮助器并传递一个空字符串作为 属性 名称,即:
@Html.TextBox("")
Razor 会根据上下文为您填充正确的值。
不过,在您这里的特定情况下。编辑器模板是一个糟糕的选择。首先,它们并不是真的要与枚举竞争。您可以在可枚举对象上使用 Html.EditorFor
,但它真正做的是检查内部类型并为可枚举对象中的每一项呈现该类型的编辑器模板,而不是为整个可枚举对象呈现一个模板 属性,本身。此外,正如 Stephen Muecke 在评论中指出的那样,最好先组合字符串,然后将该组合字符串传递给您的视图。这是视图模型派上用场的地方,因为您可以创建如下内容:
Public Class FooViewModel
Public Property Tags As IEnumerable(Of be_PostTag)
Public Property TagsAsString As String
Get
Return String.Join(",", Tags.Select(Function(x) x.Tag))
End Get
Set(ByVal Value As String)
Tags = Value.Split(",").Select(Function(x) New be_PostTag With { .Tag = x })
End Set
End Property
End Class
那么,在您看来:
@Html.TextBoxFor(Function (x) x.TagsAsString)
一些注意事项。我是一个 C# 人,所以对这段代码持保留态度。就其价值而言,VB.NET 的受欢迎程度正在迅速下降,与 ASP.NET MVC 结合使用时更是如此。对于您自己的启发,我建议您选择 C#,尤其是当您遇到问题时,您会找到更好、更有用的答案,因为 ASP.NET MVC C# 开发人员可以为您提供帮助 多大。