Visualizzazione dei record di join della tabella MVC LINQ to SQL
-
07-07-2019 - |
Domanda
Ho problemi a visualizzare i record nella mia vista quando passo viewdata a un controllo utente.Questo è evidente solo per gli oggetti linq to sql in cui utilizzo i join di tabella.
L'eccezione che ricevo è "Impossibile eseguire il cast dell'oggetto di tipo '<>f__AnonymousType410[System.String,System.Int32,System.Nullable
1[System.DateTime],System.String,System.String,System.String,System.String,System.String,System.Nullable1[System.Single],System.Nullable
1[System.Double]]' per digitare App.Models.table1."
Ho cercato una soluzione a questo problema, ma non ho molta familiarità con ciò che non va qui per cercare l'argomento giusto.Dovrebbe funzionare in teoria e funziona per il recupero di una singola tabella, ma quando ho aggiunto un join ho riscontrato dei problemi.Attualmente sto utilizzando un'istruzione foreach per interrogare i miei dati tramite una dichiarazione di tabella singola.Qualsiasi aiuto sarebbe molto apprezzato.Grazie in anticipo.
La mia configurazione attuale è:
CViewDataUC.cs (la mia classe per contenere viewdata e connessioni dati appositamente per i controlli utente)
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(Controller)
public ActionResult Information(int id)
{
ViewData["Title"] = "Information";
CViewDataUC o_info = new CViewDataUC();
o_info.Info(this.ViewData, id);
return View();
}
Informazioni.aspx(Visualizza)
<%@ 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(Controllo utente)
<%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>
<%}%>
Soluzione
foreach (table1 m in (IEnumerable)ViewData.Model)
m
non è del tipo table1
.È un tipo anonimo (select new { ... }
in CViewDataUC.cs).
Dovresti creare una classe che rappresenti il tipo di oggetti del modello che stai passando dal controller alla vista.
Altri suggerimenti
Grazie, ha funzionato come un fascino. Ho completamente ignorato il problema, immagino sia un lunedì che è il motivo: P. Ma per le persone che hanno lo stesso problema e sono ancora nuove in MVC e LINQ to SQL il problema è risolto facilmente eseguendo questi passaggi:
-
Crea una classe CInformation.cs Aggiungi variabili simili alla tua query
CInformation di classe pubblica {
public CInformation() { } public string _column1{ get; set; } public string _column2{ get; set; } ...
}
-
Nella tua query
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; }
-
Nel tuo controllo utente o vista
foreach (CInformation m in (IEnumerable) ViewData.Model) {
m.column1 m.column2 ...
}
Grazie, questo mi ha aiutato molto!
Un piccolo commento, devi usare le parentesi angolari:
IQueryable<CInformation> info = from table1 in dataContext.table1