2013-02-26 1 views
1

Je viens de commencer à apprendre MVC3. J'ai codé en ASP.NET traditionnel Pendant un moment et maintenant je voudrais passer à MVC.MVC3 Razor View Engine

Certaines choses que je ne comprends pas (probablement été utilisés différemment alors dans ASP.NET traditionnel)

Je suis en train d'écrire un module simple nouvelles qui affiche des nouvelles et permettent d'insérer un commentaire pour eux .

Donc première étape est, j'ai créé une table sur mon serveur SQL: TblNews TblCategories TblComments

Créé classe de données Linq2SQL dans le dossier Modèles et l'a nommé News.dbml contrôleur créés HomeController.cs et une méthode appelé Index() dedans. présente comme suit:

public ActionResult Index() 
     { 
      Models.NewsDataContext db = new Models.NewsDataContext(); 
      var Model = (from n in db.TblNews 
         select new 
         { 
          ID = n.ID, 
          Title = n.Title, 
          Description = n.Description, 
          Category = n.TblCategory.CategoryName 
         }); 

      return View(Model); 
     } 

Comme vous le voyez, je suis en train de sélectionner toutes les nouvelles et leurs noms de catégorie (TblNews et TblCategories ont relation entre eux)

Après que je retourne les données que j'ai eu de la requête.

Dans la vue i ont:

@{ 
    ViewBag.Title = "News Index Page"; 
} 

<table> 
    @foreach (var item in Model) 
    { 
     <tr> 
      <td> 
       ID: @item.ID<br /> 
       Title: @item.Title<br /> 
       Description: @item.Description<br /> 
       Category: @item.Category 
      </td> 
     </tr> 
    } 
</table> 

qui doit retourner quelque chose comme:

ID: 4 
Title: asd 
Description: asd 
Category: 2 

Ce sont mes données d'échantillons de tables.

Quand je lance la page, il me donne un message d'erreur:

'object' does not contain a definition for 'ID' 

mais quand je me concentre ma souris sur "élément" variable, il contient en fait:

{ ID = 4, Title = asd, Description = asd, Category = Test2 } 

J'ai essayé aussi de revenir Linq Requête en tant que liste en ajoutant .ToList() à la fin de celui-ci.

Quelqu'un peut-il me donner des indices et me diriger dans la bonne direction? Désolé, si j'ai expliqué quelque chose de façon incorrecte. L'anglais n'est pas ma langue maternelle. S'il vous plaît demander si vous avez besoin de plus d'informations.

Merci beaucoup.

P.S. J'utilise Visual Studio 2012

Répondre

0

Il vous manque votre déclaration de modèle en haut de votre vue. Par défaut, vous saisissez object.Lorsque vous faites item.ID que vous faites object.ID, ce qui est la raison pour laquelle il se plaint que object ne contient pas de définition pour ID

Ajoutez ce qui suit:

@model List<Models.NewsDataContext> 

Aussi, assurez-vous d'évaluer la requête LINQ en appelant .ToList() avant votre retour Modèle, de cette façon, la requête est déjà exécutée sur la base de données avant qu'elle n'atteigne la vue:

return View(Model.ToList()); 

Modifier: En fait, dans votre requête LINQ que vous sélectionnez dans un type anonyme, vous devez utiliser une classe concrète afin de l'utiliser dans votre vue. Le ci-dessous suppose que votre TblNews correspond à une classe appelée News:

var Model = (from n in db.TblNews 
        select new News //class name here 
        { 
         ID = n.ID, 
         Title = n.Title, 
         Description = n.Description, 
         Category = n.TblCategory.CategoryName 
        }); 

     return View(Model.ToList()); 

changer ensuite votre modèle:

@model List<News> 
+0

@ user2110925 Ah vous devez sélectionner dans en classe 'TblNews' dans votre déclaration LINQ , changez-le en 'select new TblNews' (ou quel que soit le nom de cette classe), puis changez votre modèle en' List ' (ou quelle que soit cette classe) – mattytommo

+0

Je ne comprends pas vraiment cette partie d'une classe que je devrais correspondre à. o_O Comment puis-je savoir? Mon nom de table est TblNews mais je ne comprends pas vraiment ce truc de classe. en ASP.NET traditionnel Je n'ai jamais eu à utiliser un type pour les tables, je ne devais les utiliser que lorsque je remplissais une liste déroulante ou quelque chose comme ça. Maintenant, je suis vraiment confus ... :( –

+0

@ user2110925 Je pense que votre classe est 'TblNews. 'Fondamentalement, dans votre' NewsDataContext', vous aurez un 'DbSet ' ouais? Cela signifie que vous devez utiliser le La classe 'TblNews' n'est pas spécifique à MVC, elle est spécifique à l'utilisation d'un ORM tel que framework d'entité, linq to sql, nhibernate etc. – mattytommo

Questions connexes