2015-02-11 3 views
-2

Я хотел бы знать, правильно ли я делаю шаблон редактора. И если я делаю это неправильно, можете ли вы указать мне в правильном направлении, чтобы сделать это правильно.Правильно ли это сделать шаблон редактора?

Мой редактор шаблона для текстового поля:

@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 

Edit: Я вижу различные сообщения на SO, предполагающие используя помощника TextAreaFor вместо не-для контроля (ов), чтобы можно было воспользоваться привязки модели. Но когда я пытаюсь использовать TextAreFor, VS2013 жалуется, что он недоступен. Мне нужно будет отправить PostTags обратно на сервер и сохранить их в базе данных, когда сообщение будет сделано или отредактировано. Надеюсь это поможет.

+0

Возможно, было бы более поучительно узнать о проблеме, которую вы пытаетесь решить (см .: http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Является ли то, что у вас здесь, правильный или хороший подход, во многом зависит от того, чего вы пытаетесь достичь. –

+0

Я добавил дополнительную информацию выше. –

+0

'TextArea()' и 'TextAreaFor()' привязка к свойству, но модель - это коллекция. Требуется ли текстовая область для каждого элемента в вашей коллекции или объединить все элементы в одно значение «строка» и отобразить текстовую область для этого значения? –

ответ

1

Руководство по использованию помощников стиля Html.*For - это то, что вы можете оставаться строго типизированным. Если вы используете что-то вроде Html.TextBox("Foo"), а затем избавитесь от своего свойства Foo или измените его, представление с удовольствием продолжит рендеринг ввода для Foo, независимо. Но если вы используете Html.TextBoxFor(Function(x) x.Foo), то Intellisense покажет вам, что есть проблема.

Однако помощники For не имеют тенденцию хорошо играть с шаблонами редакторов, просто потому, что контекст того, что является «моделью», изменяется внутри шаблона редактора. Теперь вы работаете только с собственностью, а не с полной моделью, которую вы видели. Вот это на самом деле лучше использовать непредоставлением For помощников и передать пустую строку в качестве имени свойства, т.е .:

@Html.TextBox("") 

Бритва будет контекстуально заполнить правильное значение для вас.

В вашем конкретном сценарии здесь. Шаблон редактора - плохой выбор. Во-первых, они не предназначены для борьбы с перечислимыми. Вы можете использовать Html.EditorFor на перечислимом, но то, что он действительно делает, это проверить внутренний тип и визуализировать шаблон редактора для этого типа для каждого элемента в перечисляемом, а не одном шаблоне для всего перечислимого свойства. Кроме того, как отметил Стивен Мюкке в комментариях, было бы гораздо лучше объединить строку, а затем передать эту комбинированную строку в ваше представление. Здесь вид модели поставляются в удобной, потому что вы можете создать что-то вроде следующего:

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#, которые могут вам помочь, это много больше.

+0

Благодарим вас за очень полезный ответ. –

+0

И на C# я работаю над тем, чтобы с ним было комфортно. –

Смежные вопросы