Question

Je ne parviens pas à afficher les enregistrements lorsque je passe des données View à un contrôle utilisateur. Cela n’apparaît que pour les objets linq to SQL où j’utilise des jointures de table.

L'exception que je reçois est & "; Impossible de convertir l'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, System.Nullable 1[System.Single],System.Nullable 1 [System.Double]] 'pour saisir App.Models.table1. & ";

J'ai cherché une solution à ce problème, mais je ne connaissais pas trop bien ce qui ne va pas ici pour que je recherche le bon sujet. Cela devrait fonctionner en théorie et cela fonctionne pour la récupération d'une seule table, mais lorsque 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 à table unique. Toute aide serait grandement appréciée. Merci d'avance.

Ma configuration actuelle est la suivante:

CViewDataUC.cs (ma classe pour contenir les connexions viewdata et data 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 (affichage)

<%@ 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>
<%}%>
Était-ce utile?

La solution

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

m n'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 passez du contrôleur à la vue.

Autres conseils

Merci, cela a fonctionné à merveille. J'ai totalement négligé le problème, je suppose que c'est un lundi, c'est pourquoi: P. Mais pour les personnes qui rencontrent le même problème et qui ne connaissent pas encore MVC et LINQ to SQL, le problème est facilement résolu, procédez comme suit:

  1. Créez une classe CInformation.cs Ajoutez des variables similaires à votre requête

    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 viewData, 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 votre vue

    foreach (CInformation m dans (IEnumerable) ViewData.Model) {

     m.column1
     m.column2
     ...
    

    }

Merci, cela m'a beaucoup aidé!

Un petit commentaire, vous devez utiliser les crochets:

IQueryable<CInformation> info = from table1 in dataContext.table1
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top