MVC LINQ to SQL Отображение записей о соединении таблиц - PullRequest
2 голосов
/ 10 ноября 2008

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

Исключение, которое я получаю: «Невозможно привести объект типа» <> 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]] 'для ввода App.Models.table1. "

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

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

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

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();
        }

Information.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>
<%}%>

Ответы [ 3 ]

3 голосов
/ 10 ноября 2008
foreach (table1 m in (IEnumerable)ViewData.Model)

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

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

2 голосов
/ 10 ноября 2008

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

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

    открытый класс CInformation {

    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 in (IEnumerable) ViewData.Model) {

     m.column1
     m.column2
     ...
    

    }

1 голос
/ 16 ноября 2008

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

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

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