2009-10-10 6 views
1

J'utilise NerdDinner comme guide pour mon premier projet MVC/LINQ to SQL. Il traite de l'utilisation du modèle ViewModel lorsqu'une vue a besoin de données provenant de plusieurs sources - dans son exemple: Dinners et Countries (sert de liste déroulante).Est-ce l'utilisation correcte du modèle ViewModel?

Dans mon application, le problème est un peu différent. Ce ne sont pas tellement des données différentes, mais plutôt des données liées par une contrainte de clé. J'ai une table Story qui lie à aspnet_users via la clé UserId. Je voudrais avoir un accès facile au UserName pour chaque histoire.

Étant donné que j'utilise le modèle de référentiel et que je renvoie IQueryable dans certains cas pour une exécution différée, je suis confronté à la manière correcte de façonner les données. J'utilise donc ce pattern VideModel pour le faire fonctionner mais je ne sais pas si c'est la bonne façon. Au lieu de conserver IQueryable Story (qui ne fonctionnerait pas puisque j'ai besoin du nom d'utilisateur), je renvoie une nouvelle UserStory de classe personnalisée, qui a une propriété Story et une propriété Username de chaîne.

Que pensez-vous?

Répondre

0

Si vous regardez Kigg, vous verrez qu'ils déconner avec le modèle initial pour créer ViewModels personnalisés. C'est ce que NerdDinner ne couvre pas dans les moindres détails. Vous pouvez créer une classe StoriesWithUserName qui hérite de Stories, mais ajoute une nouvelle propriété - UserName.vous revenez ensuite que votre opinion qui héritera de IEnumerable <StoriesWithUserName>

[EDIT]

Oops. Je n'ai pas remarqué que vous aviez déjà fait ceci: o)

1

Il semble que votre question ait moins à voir avec MVC car il s'agit simplement d'une question sur la façon d'accéder aux données de l'histoire en fonction de la chaîne du nom d'utilisateur.

Serait-il possible de créer une vue dans votre base de données avec toutes les données UserStory, le nom d'utilisateur et l'ID utilisateur? De cette façon, vous pouvez sélectionner dans la vue en fonction du nom d'utilisateur que vous avez. Pour créer la vue, vous devez simplement faire une jointure entre la table utilisateur et la table userstory en fonction de l'ID utilisateur. Après cela, vous pouvez toujours utiliser le modèle de référentiel avec l'IQueryable renvoyé.

Si vous voulez faire des mises à jour, ce serait simple à faire puisque vous avez encore l'ID utilisateur, et seriez capable de revenir à la table réelle qui aurait besoin de la mise à jour.

+0

Je me suis fait trébucher parce qu'à l'origine je retournais un IQueryable de l'histoire mais en tirant le nom d'utilisateur ne fait plus cela une histoire et je devenais anonyme aux erreurs de moulage d'histoire. – Mike

0

L'utilisation du modèle de référentiel et le retour d'un IQueryable of Stories sont corrects. La relation vous permet d'accéder à la valeur de nom d'utilisateur chose comme cette >>

En supposant que vous restituez le IQueryable dans votre modèle objet:

foreach(Story story in Model.Stories) 
{ 
    // do something with the value 
    response.write(story.aspnet_user.UserName); 
}; 

Votre méthode Repository ressemblerait à ceci:

public List<Stories> GetStories(Guid UserId) 
{ 
    return datacontext.Stories.Where(u => u.UserId = UserId).ToList(); 
} 

La relation vous donnera automatiquement accès à la valeur UserName dans la boucle foreach mentionnée en premier. rien de plus n'est requis.

Je ne sais pas pourquoi votre contrôle de pagination a échoué sur Count() si ??

Hope this helps

+0

Le problème provient d'un contrôle de pagination que j'ai trouvé en ligne que j'utilise. Quand je revenais juste IQueryable des histoires (moins le nom d'utilisateur) c'était juste bien. Cependant, après avoir essayé votre méthode, l'application a été bombardée lors de l'exécution lorsque l'assistant de pagination a créé un fichier source.Count(); Je ne comprends pas complètement les types/linq anonymes pour savoir pourquoi cela a été fait. Cependant, j'ai évité cette erreur en créant la classe UserStory et en conservant IQueryable UserStory ... des idées pour lesquelles cela s'est produit? – Mike

Questions connexes