我想知道我是否正确地编辑了一个编辑器模板。如果我做错了,你能指出我正确的方向去正确地做。
我的textarea编辑模板:
@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上看到各种帖子建议使用TextAreaFor帮助程序而不是非For控件,以便可以利用模型绑定。但是当我尝试使用TextAreFor时,VS2013抱怨它无法访问。我需要将PostTags发布回服务器,并在制作或编辑帖子时将它们保存到数据库中。希望这可以帮助。
答案 0 :(得分:1)
使用Html.*For
样式帮助程序的指导是为了保持强类型。如果您使用类似Html.TextBox("Foo")
的内容,然后删除或更改Foo
属性的名称,则视图将很乐意继续呈现Foo
的输入,无论如何。但是,如果您使用Html.TextBoxFor(Function(x) x.Foo)
,那么智能感知会向您显示存在问题。
但是,For
帮助程序不适合编辑器模板,只是因为“模型”的上下文在编辑器模板中发生了变化。您现在正在使用该属性,而不是您的视图所具有的完整模型。在这里,最好使用非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#开发人员很多更大。