2011-01-06 2 views
22

Nella mia vista ho alcuni collegamenti di amministrazione che vorrei nascondere e mostrare in base al ruolo dell'utente come può farlo all'interno della vista, ad es.ASP.NET MVC Controllare il ruolo all'interno della vista

<%= if(CHECK IF USER ROLE ADMIN) { %> 
     <div class="tools"> 
      <ul> 
       <li class="edit"><%= Html.ActionLink("Edit", "Edit", new { id = Model.storyId }) %></li> 
       <li class="delete"><%= Html.ActionLink("Delete", "Delete", new { id = Model.storyId }) %></li> 
      </ul> 
     </div> 
<%= } %> 
+7

Si potrebbe desiderare di eseguire proprio questo controllo nella vostra azione e mettere il valore in Viewdata hash o come proprietà sul tuo viewmodel per mantenere stupide le tue opinioni. – R0MANARMY

+0

Preferirei semplicemente controllare all'interno della vista usando una semplice istruzione if. L'ho già fatto ma non ricordo il codice. – Cameron

+1

Solo perché l'hai già fatto prima non ne fa una grande idea. Ricorda qualsiasi codice (per quanto banale) che hai inserito nella tua vista è il codice che non puoi (almeno facilmente) scrivere test contro o refactoring. Rob Connery ha anche scritto un bel post su [Avoiding Tag Soup] (http://blog.wekeroad.com/blog/asp-net-mvc-avoiding-tag-soup/). – R0MANARMY

risposta

22
<% if (Page.User.IsInRole("Admin")){ %> 

<%}%> 

Tuttavia questa è una pessima idea, a mio parere. È meglio consentire a ViewData o Model di rappresentare ciò che la vista deve essere visualizzata e la vista può semplicemente controllare i dati della vista. Una classe di base del controller o un filtro azione possono rendere l'uso ripetitivo di questo molto semplice e consentire al codice di esistere in un'unica posizione.

+0

Di solito uso un ViewModel per inviare questo tipo di informazioni da un controller. Tuttavia, sto cercando di visualizzare alcune cose nel mio _Layout.cshtml principale basato sui ruoli. Quanto è "terribile" l'idea e perché? Ne varrebbe la pena di creare viste parziali fortemente tipizzate solo per aggiungere una classe qua e là che mostra e nasconde il contenuto, o è questo l'uso selettivo di un metodo di supporto nella mia multa _Layout? Mi innervosisco solo per le affermazioni generalizzate che le cose sono "idee terribili". – Methodician

+0

Si può semplicemente fare in modo che il modello di vista definisca cosa mostrare ed elabori tutta la logica dei ruoli nel controllore (o una classe utilizzata dal controllore) e assegna il modello di vista in modo appropriato. Controllarlo direttamente funziona ancora, ma sarà meno gestibile in progetti di grandi dimensioni ed è più facile da gestire per la vista. – CRice

+0

È possibile effettuare la chiamata se ne vale la pena o meno in base alla situazione. – CRice

0

Sono d'accordo con molti altri che questi dati devono essere forniti "predeterminati", se lo si desidera, dal controller o altri servizi aziendali, mentre la vista utilizza semplicemente, per quanto possibile, markup html e strutture di controllo della lingua per "rimpolpare la pagina" utilizzando altri tipici della pagina web chicche da costruzione come jQuery, css, ecc ecc

+1

Non capisco la tua affermazione, potresti riformulare? –

38
@if (this.User.IsInRole("Administrator")) 
{ 

} 
+2

Questa dovrebbe essere la risposta accettata. –

+1

usando questo. risolto il problema – PAVITRA