8

現在、MVCプロジェクトのHomeControllerに次のコードがあります。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        MyDataContext dc = new MyDataContext();

        IQueryable<Table1Data> j =
            from n in dc.Table1                     
            select n;

        return View(j);
    }

これで問題ありませんが、2番目のテーブルを同じビューに渡します。だから私はこのようなことをすることができるはずだと思っていました:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        MyDataContext dc = new MyDataContext();

        IQueryable<Table1Data> j =
            from n in dc.Table1                     
            select n;

        IQueryable<Table2Data> l =
            from k in dc.Table2        
            select k;

        return View(j, l);
    }

ビューにこのような2つのモデルを受け入れる方法、または2つの結果セットをマージする方法はありますか(2つのテーブルはリンクされていません)?

4

7 に答える 7

17

はい、ありますが、それほどではありません。やりたいことを行う方法は、カスタムViewModelクラスを作成することです。このクラス(MyPageViewModel)には、オブジェクトごとに1つずつ、合計2つ(またはそれ以上)のプロパティがあります。あなたの見解では、とを使用してそれらにアクセスしModel.Table1DataますModel.Table2Data

カスタムViewModelクラス非常に単純です。

public class MyPageViewModel
{
   public IQueryable<Table1Data> Table1Data { get; set; }
   public IQueryable<Table2Data> Table2Data { get; set; }
}

ビューは、このカスタムViewModelクラスに強く型付けする必要があります

<%@ Page Title="MyPage" MasterPageFile="~/Application/Master Pages/Site.Master"
    Inherits="System.Web.Mvc.ViewPage(Of MyAppNamespace.MyPageViewModel)" %>

自分で入力しようとしないでください。新しいビューを作成して「強く型付けされた」ビューをチェックし、新しいカスタムビューモデルクラスを指定する方が簡単です。

次に、アクションコントローラーのメソッドは次のようになります。

public class HomeController : Controller
{
  public ActionResult Index()
  {
    MyDataContext dc = new MyDataContext();

    MyPageViewModel vm = new MyPageViewModel();

    vm.Table1Data =  from n in dc.Table1                     
                     select n;

    vm.Table1Data = from k in dc.Table2        
                    select k;

    return View(vm);
  }
}
于 2011-03-30T15:24:30.087 に答える
3

はい-両方のテーブルを含む新しいクラスを作成します-モデルとして使用します-:

public class MyModel {
   public IQueryable<Table1Data> Table1Data { get; set; }
   public IQueryable<Table2Data> Table2Data { get; set; }
}

次に、コントローラーで、このクラスを初期化し、両方のプロパティにデータを入力して、ビューに送信します。次に、ビューを変更して、この新しいタイプをビューモデルとして認識します。

于 2011-03-30T15:24:26.647 に答える
2

「テーブル」のリストを作成し、これをビューモデルに渡すことで問題を解決しました。これは基本的に、TransactionEntities のリストのリストです。参考までに、私のソリューションは DAL という名前で、モデルではトランザクションを表す TransactionEntity を作成しました。

    private TransactionEntity te;
    private IEnumerable<TransactionEntity> tel1; // A list of TransactionEntities
    private IEnumerable<TransactionEntity> tel2;
    private IEnumerable<TransactionEntity> tel3;
    private IEnumerable<IEnumerable<TransactionEntity>> telCollection;

トランザクション エンティティ リスト (tel1、tel2、tel3) に te 'rows' を入力し、3 つの 'tel' オブジェクト (基本的にはテーブルのようなもの) を telCollection に追加し、これを ViewData.Model に割り当てます。

    telCollection = new List<IEnumerable<TransactionEntity>>();
    telCollection = telCollection.Concat(new[] { tel1 });
    telCollection = telCollection.Concat(new[] { tel2 });
    telCollection = telCollection.Concat(new[] { tel3 });
    ViewData.Model = telCollection;
    return View();

次に ASPX ファイルで、リストを取得し、各「テーブル」(ElementAt(#)) を反復処理して、「テーブル」ごとに 1 つずつ、3 つの異なる列を作成します。ところで、カウンター変数は無視できます。

<td>
   <% int counter = 0; %>
   <% IEnumerable<IEnumerable<DAL.Models.TransactionEntity>> tranlist = 
          (IEnumerable<IEnumerable<DAL.Models.TransactionEntity>>)ViewData.Model; %>

   <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(0))
      {.... create rows/columns as needed for the data in a HTML sub-table ......} %>
 </td>
 <td>
    <% counter = 0; %>
    <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(1))
      {..........} %>
 </td>
 <td>
    <% counter = 0; %>
    <% foreach (DAL.Models.TransactionEntity te in tranlist.ElementAt(2))
      {..........} %>
 </td>
于 2012-01-16T22:18:35.427 に答える
2

このために、モデルにクラスを追加してみませんか?

public class MyModel {

public j {get; set;}
public l {get; set;}

}

次に、ビューのヘッドのビューに MyModel を渡します。

コントローラーで:

public ActionResult Index() { MyDataContext dc = new MyDataContext();

    IQueryable<Table1Data> j =
        from n in dc.Table1                     
        select n;

    IQueryable<Table2Data> l =
        from k in dc.Table2        
        select k;

    MyModel myclass = new MyModel();
    myclass.j = j;
    myclass.l = l;

    return View(myclass);
}
于 2011-03-30T15:25:13.307 に答える
1

両方を単一の ViewModel にすることができます。

モデル定義:

public class YourModelName
{
       public IQueryable<Table1Data> FirstTableData { get; set;}
       public IQueryable<Table2Data> SecondTableData { get; set;}

       public YourModelName(IQueryable<Table1Data> d1, IQueryable<Table2Data> d2)
       {
            this.FirstTableData = d1;
            this.SecondTableData = d2;
       }
}

使用法 (コントローラー内):

public ActionResult Index()
    {
        MyDataContext dc = new MyDataContext();

        IQueryable<Table1Data> j =
            from n in dc.Table1                     
            select n;

        IQueryable<Table2Data> l =
            from k in dc.Table2        
            select k;

         YourModelName model = new  YourModelName(j, l);

        return View(model);
    }
于 2011-03-30T15:26:28.277 に答える
0

MVC3 以前では、ViewModel を使用し、ビューで使用する各オブジェクトのプロパティを追加していました。MVC3 を使用している場合は、 ViewBag をご覧ください

シンプルなビュー モデル:

public class SomeViewModel
{
   public object Object1 { get; set; }
   public string Message { get; set; }
}

次に、コントローラーでこれをビューに渡します。

var vm = new SomeViewModel { Object1 = coolThing, Message = neatMessage };
return View(vm);
于 2011-03-30T15:24:39.253 に答える
0

おそらくViewModelを使用する必要があります。必要な両方のクラスのインスタンス (+ その他の追加プロパティ) を含むクラスを定義し、これをモデルとして使用します。

class NewViewModel {
    Table1 T1 {get;set;}
    Table2 T2 {get;set;}
    int Anything {get;set;}
}

次に、これらの ViewModel クラスのコレクションを準備し、後で次のようにそれらのインスタンスにアクセスします。

NewViewModel m = new NewViewModel();
var a = m.T1.PropertyA;
var b = m.T2.PropertyB;

など.必要なすべてのエンティティを1つのクラスにマージし、このクラスをコントローラーとビューのモデルとして使用するだけです.

于 2011-03-30T15:26:34.353 に答える