web-dev-qa-db-fra.com

Utilisation de System.Data.Linq dans une vue Razor

J'ai peut-être un malentendu fondamental sur ce qui se passe ici, mais un problème survient en boucle dans une classe LinqToSQL dans ma vue rasoir:

<h3>Owners</h3>
@foreach (var ThisOwner in Prop.PropertyOwnerships.Where(p=p.bIsOwner.Value==true))
{
<div class="ODEditEntry">
...

Je reçois l'erreur suivante:

Message d'erreur du compilateur: CS0012: Le type 'System.Data.Linq.EntitySet`1' est défini dans un assembly qui n'est pas référencé. Vous devez ajouter une référence à Assembly 'System.Data.Linq, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089'.

J'ai essayé de mettre @using System.Data.Linq en haut du fichier cshtml mais cela me dit que Linq n'existe pas dans l'espace de noms System.Data. Ce n'est évidemment pas vrai et, oui, j'ai system.data.linq comme référence dans mon projet.

Des idées ici? Une importation est-elle nécessaire? Puis-je tout simplement ne pas utiliser de style Linq dans mes vues de rasoir? Cela semblerait ... étrange?

25
Austin Fatheree

Vous devez importer l'espace de noms dans votre vue en ajoutant @using System.Data.Linq en haut de votre vue. Cependant, si vous le souhaitez dans toutes vos vues, vous devez ajouter <add namespace="System.Data.Linq" /> au web.config dans votre dossier Views:

  <system.web.webPages.razor>
    <Host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Data.Linq" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

Bien que cela ne corresponde pas à votre question, vous devriez vraiment essayer de déplacer cette logique hors de la vue et dans le contrôleur, cela facilitera beaucoup le débogage et permettra de séparer votre présentation de votre logique métier.

42
Adam Flanagan

Pour moi, ce qui a été résolu, c’est de cliquer avec le bouton droit de la souris sur la référence d’assemblage System.Data.Linq, puis de cliquer sur Propriétés. Dans ce cas, définissez Copy Local sur true.

20
Pedro

Vous devez ajouter une référence à System.Data.Linq dans votre projet et/ou dans votre Web.config.

0
SLaks

Votre contexte de données Linq-to-Sql existe-t-il en dehors du projet Web (par exemple, dans une autre bibliothèque de classes)? Si c'est le cas, si vous avez ajouté une référence à ce projet, tout se passe bien, mais dans la vue Razor, vous essayez d'accéder directement à un type de l'assembly System.Data.Linq sans le référencer dans le projet Web. Essayez d’ajouter la référence au projet Web principal et voyez ce que vous obtenez.

0
Matthew Abbott