CheckBoxList para string, salvar no banco de dados e depois converter para a matriz
-
19-09-2019 - |
Pergunta
Eu sei que o assunto pode ser um pouco estranho, mas eu não tinha certeza de como descrever exatamente meu objetivo
Estou tentando fazer algumas permissões baseadas em função em um sistema de gerenciamento de conteúdo. A melhor maneira de pensar para fazer isso é puxar a lista de funções do banco de dados e colocá -las em uma lista de seleção. A partir daí, salvo uma sequência separada por vírgula dos valores verificados nos detalhes da página do banco de dados. Finalmente, quando a página é puxada de volta, verifico se o usuário atual tem permissão puxando a corda separada da vírgula e dividindo -a em uma string () e percorre os valores.
A preocupação que tenho é que, quando percorro a lista de seleção e converto os valores em uma string, o método loop adiciona uma vírgula ao final da string ... Eu então tenho que tirar a vírgula antes de salvá -la no banco de dados.
Minha pergunta é: existe uma maneira melhor de fazer isso para que eu não precise voltar para a corda e tirar a vírgula à direita antes de salvar?
''# this is to get all selected items from
''# a checkboxlist and add it to a string
''# the reason for this is to insert the final string
''# into a database for future retrieval.
Dim i As Integer
Dim sb As StringBuilder = New StringBuilder()
For i = 0 To CheckBoxList1.Items.Count - 1
If CheckBoxList1.Items(i).Selected Then
sb.Append(CheckBoxList1.Items(i).Value & ",")
End If
Next
''# now I want to save the string to the database
''# so I first have to strip the comma at the end
Dim str As String = sb.ToString.Trim(",")
''# Then save str to the database
''# I have now retrieved the string from the
''# database and I need to now add it to a One Dimensional String()
Dim str_arr() As String = Split(str, ",")
For Each s As String In str_arr
''# testing purposes only
Response.Write(s & " -</br>")
''# If User.IsInRole(s) Then
''# Do Stuff
''# End If
Next
Solução
Coloque todos os valores em uma lista de strings e use String.Join para concatená -los. Não vou comentar sobre como manter uma lista separada por vírgula, em vez de um relacionamento um para muitos dos usuários com funções. :-)
Dim values as List(Of String) = New List(Of String)()
For i = 0 To CheckBoxList1.Items.Count - 1
If CheckBoxList1.Items(i).Selected Then
values.Add( CheckBoxList1.Items(i).Value )
End If
Next
Dim str As String = String.Join( ",", values.ToArray() )
Outras dicas
Você talvez tenha simplesmente uma tabela de banco de dados que contém uma referência à página (seja por nome, caminho ou algum outro ID exclusivo) e uma referência à função?
Certamente não estou dizendo que esta é a melhor solução (por qualquer meio), é simplesmente um exemplo:
Tabela de papéis:
RoleId | RoleName
_________________
1 | Editor
2 | Administrator
Tabela de página:
PageId | PageName
8 | ~/Page1.aspx
9 | ~/OtherPlace/Page2.aspx
Tabela de Pagerole:
RoleId | PageId
2 | 8
2 | 9
1 | 9
Você armazenaria seus dados na tabela de junção e, ao acessar a página, retire suas funções com base na página atual. Obviamente, ele não precisa com base na página, você pode substituir com a mesma facilidade no meu exemplo por permissão.
Se você usar a associação do ASP.NET, poderá atribuir várias funções a um usuário.
Roles.AddUserToRoles(username, roles);
Roles.IsUserInRole(role);
Apenas algo a considerar.