質問

viewdataをユーザーコントロールに渡すときに、ビューにレコードを表示するときに問題が発生します。 これは、テーブル結合を使用しているlinq to sqlオブジェクトでのみ明らかです。

受け取った例外は、<!> quot;タイプ '<!> lt; <!> gt; 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。<!> quot;

と入力します

この問題の修正を検索しましたが、ここで何が間違っているのかよく知らず、適切な主題を検索できません。これは理論的には機能するはずであり、これは単一のテーブルの取得に対して機能しますが、結合を追加すると問題に遭遇しました。現在、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(Controller)

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>
<%}%>
役に立ちましたか?

解決

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

mはタイプtable1ではありません。これは匿名型です(CViewDataUC.csのselect new { ... })。

コントローラからビューに渡すモデルオブジェクトのタイプを表すクラスを作成する必要があります。

他のヒント

ありがとう、それは魅力のように働いた。私は問題を完全に見落としていました。月曜日だからだと思います: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((IEnumerable)ViewData.ModelのCInformation m){

     m.column1
     m.column2
     ...
    

    }

ありがとう、これは私を大いに助けてくれました!

1つの小さなコメント、山かっこを使用する必要があります:

IQueryable<CInformation> info = from table1 in dataContext.table1
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top