MVC LINQ to SQL Tabela Junte gravar a exibição
-
07-07-2019 - |
Pergunta
Estou tendo problemas para exibir registros a minha visão ao passar viewdata para um controle de usuário. Esta é apenas aparente para LINQ para objetos SQL onde eu estou usando a tabela junta.
A exceção que recebo é "Não é possível objeto fundido do 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]]' para digitar App.Models.table1. "
Eu tenho procurado uma solução para esta questão, mas não muito familiarizado sobre o que está errado aqui para eu procurar o assunto direita. Este deveria estar trabalhando na teoria e isso funciona para única tabela recuperando mas quando eu adicionei uma associação na sua ran I em problemas. Atualmente, estou usando uma instrução foreach para consulta através do meu dados através de declaração de mesa única. Qualquer ajuda seria muito apreciada. Agradecemos antecipadamente.
Minha configuração atual é:
CViewDataUC.cs (minha classe para ViewData espera e conexões de dados especificamente para controles de usuário)
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();
}
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 (Controle do Usuário)
<%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>
<%}%>
Solução
foreach (table1 m in (IEnumerable)ViewData.Model)
m
não é do tipo table1
. É um tipo anônimo (select new { ... }
em CViewDataUC.cs).
Você deve criar uma classe que representa o tipo do modelo de objetos que você está passando do controlador para a vista.
Outras dicas
Obrigado, isso funcionou como um encanto. Eu ignorado totalmente o problema, eu acho que é uma segunda-feira que é por isso: P. Mas para as pessoas que são executados no mesmo problema e ainda é novo para MVC e LINQ to SQL o problema é resolvido facilmente fazer estes passos:
-
Crie uma classe CInformation.cs Adicionar variáveis ??similiar à sua consulta ??p>
classe pública CInformation {
public CInformation() { } public string _column1{ get; set; } public string _column2{ get; set; } ...
}
-
Na sua consulta ??p>
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; }
-
Em seu User Control ou vista ??p>
foreach (CInformation m em (IEnumerable) ViewData.Model) {
m.column1 m.column2 ...
}
Obrigado, isso me ajudou muito!
Um pequeno comentário, você tem que usar colchetes:
IQueryable<CInformation> info = from table1 in dataContext.table1