2010-01-17 5 views
0

J'ai besoin d'un moyen d'afficher si un utilisateur s'est abonné à un service et de l'afficher dans une table dans une vue. Jusqu'à présent, je suis en mesure de montrer si un utilisateur a souscrit à un service mais ne suis pas en mesure de montrer quand ils ne sont pas abonnés.Comment gérer une liste filtrée et non filtrée dans la même vue mvc asp.net?

J'ai créé un viewmodel comme ceci:

public class MyServicesController : Controller {

public ActionResult Index() 
    { 
     WillEntities we = new WillEntities(); 

     var servicegroups = we.ServiceGroupSet.ToList(); 
     var services = we.ClientServiceSet.Include("AspnetUser").ToList(); 
     var aspnetusers = we.AspnetUserSet.Include("ClientService").ToList(); 

     return View(new MyServicesViewModel (servicegroups, services, aspnetusers)); 
    } 
} 

ensuite rendu la table des services à la vue comme ceci:

<div id="Services"> 
<h2>My Services</h2> 
<table> 
<tr>   
<th class="th1"> 
Service Name 
</th> 
<th class="th3"> 
Select/Deselect 
</th> 
</tr> 
</table> 
<% foreach (var servgroup in Model.ServiceGroups) 
{ %> 
<ul> <%= servgroup.GroupName %> </ul>  
<table> 
<% foreach (var serv in servgroup.ClientService) 
{ %> 
<tr> 
<td class="td1">  
<%= serv.Description%> 
</td> 
<td class="td3">   
<%foreach (var user in serv.AspnetUser) 
{ %> 
<%if (user.UserName.Equals(User.Identity.Name, >StringComparison.OrdinalIgnoreCase)) 
{ %> 
Already subscribed    
<% } 
else 
{%> 
<%} %> 
<%} %>  
</td> 
</tr>   
<% } %> 
</table>   
<% } %> 
</div> 

Ce qui fonctionne très bien à tirer et filtrer tout les utilisateurs abonnés à ce service puis voyant si l'utilisateur actuel est dans cette liste.

Mais étant donné qu'en filtrant de cette manière en utilisant la clause <%foreach (var user in serv.AspnetUser), je tire seulement de la liste des utilisateurs qui ont choisi un service donné.

J'ai donc aucun moyen au moment de saisir les et services non choisis pour afficher le « Pas encore abonné » chaîne à rendre dans la ligne de ce service dans la table.

J'ai essayé de créer une fonction booléenne pour tirer le « utilisateur » var ci-dessus et retourner un vrai ou faux si l'utilisateur a souscrit à ce service:

public class MyServicesViewModel 
{  

    public bool UsersServices(AspnetUser user) 
    { 
     if (user.UserId.ToString() == "35l1cob9-rest_of_user_guid-96975") 
      return (true); 
     else 
      return (false); 
    } 
} 

mais ne pouvait pas comprendre un moyen de l'obtenir dans la vue, et obtenir le sentiment que je suis trop compliqué en essayant cette méthode.

Quelqu'un peut-il voir une façon moins compliquée de le faire?

Merci beaucoup,

Paul

Répondre

1

On dirait que vous utilisez Entity Framework pour votre ORM? Je suis plus familier avec Linq to SQL, et il est difficile de vous donner une solution exacte sans connaître tous les détails des coulisses - mais en supposant que vous ayez les relations clés primaires/étrangères appropriées dans votre db - vous devriez pouvoir utiliser linq pour interroger les informations dont vous avez besoin:

<table> 
<tr> 
<td class="td1">  
<%= serv.Description%> 
</td> 
<td class="td3">   
<% if (serv.AspnetUser.Where(u => u.UserName == User.Identity.Name).Count() > 0) 
{ %> 
Already subscribed 
<% } 
else 
{ %> 
Not subscribed 
<% 
} %> 
</td> 
</tr>   
</table> 

Hope that helps.

+0

Merci Bryan, oui qui a travaillé avec juste un peu de couture .. J'ai mis quelques parenthèses après le .Count [i.e. .Count()> 0)] et cela a ensuite parfaitement fonctionné. J'ai ensuite pu supprimer le <% foreach (var serv dans servgroup.ClientService) –

Questions connexes