Вопрос

У меня возникли проблемы с отображением записей в моем представлении при передаче данных просмотра в пользовательский элемент управления.Это очевидно только для объектов linq to sql, где я использую соединения таблиц.

Я получаю исключение: «Невозможно привести объект типа '<>f__AnonymousType4».10[System.String,System.Int32,System.Nullable1[System.DateTime],System.String,System.String,System.String,System.String,System.String,System.Nullable1[System.Single],System.Nullable1[System.Double]]', чтобы ввести App.Models.table1."

Я искал решение этой проблемы, но не слишком хорошо разбираюсь в том, что здесь не так, чтобы искать нужную тему.Теоретически это должно работать, и это работает для извлечения одной таблицы, но когда я добавил в них соединение, я столкнулся с проблемами.В настоящее время я использую оператор foreach для запроса моих данных с помощью объявления одной таблицы.Любая помощь будет принята с благодарностью.Заранее спасибо.

Моя текущая настройка:

CViewDataUC.cs(мой класс для хранения данных просмотра и подключений к данным специально для пользовательских элементов управления)

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(Контроллер)

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


            CViewDataUC o_info = new CViewDataUC();

            o_info.Info(this.ViewData, id);


            return View();
        }

Информация.aspx(Просмотр)

<%@ 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 (контроль пользователя)

<%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>
<%}%>
Это было полезно?

Решение

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

m не относится к типу table1.Это анонимный тип (select new { ... } в CViewDataUC.cs).

Вам следует создать класс, который представляет тип объектов модели, которые вы передаете из контроллера для просмотра.

Другие советы

Спасибо, это сработало как шарм.Я полностью упустил из виду проблему, думаю, сегодня понедельник, поэтому :P.Но для людей, которые столкнулись с той же проблемой и еще не знакомы с MVC и LINQ to SQL, проблема легко решается, выполнив следующие действия:

  1. Создайте класс CInformation.cs. Добавьте переменные, аналогичные вашему запросу.

    публичный класс CИнформация {

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

    }

  2. В вашем запросе

    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. В вашем пользовательском элементе управления или просмотре

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

     m.column1
     m.column2
     ...
    

    }

Спасибо, это мне очень помогло!

Один небольшой комментарий: вам придется использовать угловые скобки:

IQueryable<CInformation> info = from table1 in dataContext.table1
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top