2008-11-10 11 views
2

Je rencontre des problèmes lors de l'affichage des enregistrements dans ma vue lors du passage de viewdata à un contrôle utilisateur. Cela n'est apparent que pour les objets linq to sql où j'utilise des jointures de table.MVC LINQ to SQL Affichage de jointure de table SQL

L'exception est que je reçois « Impossible de coulée objet de type" <> f__AnonymousType4 10[System.String,System.Int32,System.Nullable 1 [System.DateTime], System.String, System.String, System.String, System.String, System.String, système. Nullable 1[System.Single],System.Nullable 1 [System.Double]] 'pour taper App.Models.table1. "

J'ai cherché une solution à ce problème, mais pas trop familier sur ce qui est mal ici pour moi de chercher le bon sujet. Cela devrait fonctionner en théorie et cela fonctionne pour la récupération de table unique mais quand j'ai ajouté une jointure dans leur, j'ai rencontré des problèmes. J'utilise actuellement une instruction foreach pour interroger mes données via une déclaration de table unique. Toute aide serait grandement appréciée. Merci d'avance.

Ma configuration actuelle est:

CViewDataUC.cs (ma classe pour maintenir les connexions de données vidéotex et spécifiquement pour les contrôles utilisateur)

public void Info(ViewDataDictionary viewData, int id) 
    { 
     var dataContext = new testDataContext(); 

     var info = from table1 in dataContext.table1 
        join table2 in dataContext.table2 on table1.type_id equals table2.type_id 
        join table3 in dataContext.table3 on table1.id equals table3.id 
        join table4 in dataContext.table4 on table1.id equals table4.id 
        where table1.id == id 
        select new 
        { 
         table1.column1, 
         table1.column2, 
         table1.column3, 
         table1.column4, 
         table1.column5, 
         table1.column6, 
         table1.column7, 
         table2.column1, 
         table3.column1, 
         table4.column1 
        };   

     viewData["vd_Info"] = info; 

    } 

HomeController.cs (contrôleur)

public ActionResult Information(int id) 
     { 
      ViewData["Title"] = "Information"; 


      CViewDataUC o_info = new CViewDataUC(); 

      o_info.Info(this.ViewData, id); 


      return View(); 
     } 

Information.aspx (View)

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" 
    CodeBehind="Info.aspx.cs" Inherits="App.Views.Info" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 
    <%Html.RenderPartial("~/Views/UserControls/Info.ascx", ViewData["vd_Info"]);%> 
</asp:Content> 

Info.ascx (Contrôle utilisateur)

<%foreach (table1 m in (IEnumerable)ViewData.Model) 
    { %> 
<div class="left"> 
    <br /> 
    <br /> 
    <p id="medium"> 
     Column 1 
     <br /> 
     <%= Html.TextBox("column1", m.column1, new {@class = "textBox", @readonly = "readonly" })%> 
     Column 1 
     <br /> 
     <%= Html.TextBox("column2", m.column2, new {@class = "textBox", @readonly = "readonly" })%> 
     <br /> 
     Column 1 
     <br /> 
     <%= Html.TextBox("column3", m.column3, new {@class = "textBox", @readonly = "readonly" })%> 
       </p> 
</div> 
<%}%> 

Répondre

3
foreach (table1 m in (IEnumerable)ViewData.Model) 

m est pas de type table1. C'est un type anonyme (select new { ... } dans CViewDataUC.cs).

Vous devez créer une classe qui représente le type des objets de modèle que vous transmettez du contrôleur à afficher.

2

Merci, cela a fonctionné comme un charme. J'ai totalement négligé le problème, je suppose que c'est un lundi c'est pourquoi: P. Mais pour les gens qui courent dans le même problème et sont encore nouveau pour MVC et LINQ to SQL le problème est résolu facilement faire comme suit:

  1. Créer une CInformation.cs classe Ajouter des variables à votre requête similaire

    public class CInformation {

    public CInformation() { } 
    
    public string _column1{ get; set; } 
    public string _column2{ get; set; } 
    ... 
    

    }

  2. Dans votre requête

    public void uc_VDGenInfoDC (ViewDataDictionary vidéotex, int id) {

    var dataContext = new testDataContext(); 
    
        IQueryable<CInformation> info = from table1 in dataContext.table1 
                join table2 in dataContext.table2 on table1.type_id equals table2.type_id   
                join table3 in dataContext.table3 on table1.id equals table3.id     
                join table4 in dataContext.table4 on table1.id equals table4.id      
           where table1.test_id == id 
           select new CInformation 
           { 
            _column1 = table1.column1.ToString(), 
            _column2 = table2.column1.ToString(), 
            ... 
           };   
    
        viewData["vd_Info"] = info; 
    
    } 
    
  3. Dans votre contrôle utilisateur ou vue

    foreach (CInformation m (IEnumerable) ViewData.Modèle) {

    m.column1 
    m.column2 
    ... 
    

    }

1

Merci, cela m'a beaucoup aidé!

Un petit commentaire, vous devez utiliser équerres:

IQueryable<CInformation> info = from table1 in dataContext.table1