C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 一覧がモデルのいちプロパティの場合でのPagedList使用


(過去ログ 166 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■96068 / inTopicNo.1)  一覧がモデルのいちプロパティの場合でのPagedList使用
  
□投稿者/ はる (39回)-(2020/10/19(Mon) 18:58:58)

分類:[.NET 全般] 

VisualStudio2019のASP.NET MVCでEntityFrameworkのコードファーストにて開発しています。
(先ほども別件で質問してしまいました。何度も恐縮です。)

https://docs.microsoft.com/ja-jp/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/sorting-filtering-and-paging-with-the-entity-framework-in-an-asp-net-mvc-application

を参考にソート変更+ページング可能な一覧を持つ検索画面を作成しています。
このチュートリアルでは、ソート(GET)も検索(POST)も同じIndexメソッドで実装されています。

それを踏まえて以下のようなモデルをバインドして作成しています。

■ビューモデル
  public class SearchTvView          //このクラスは画面からの引数受け取り用
  {
    [DisplayName("ソート順")]
    public string SortOrder { get; set; }  //こちらはチュートリアルにある「sortOrder」パラメータです。

    [DisplayName("アニメフラグ")]
    public bool IsAnime { get; set; }    //アニメ番組かどうか

    [DisplayName("結果一覧")]
    public List<TvItemView> TvItemsView { get; set; }
  }

  public class TvItemView           //このクラスは一覧画面表示用
  {
    [DisplayName("テレビID")]
    public string TvId { get; set; }

    [DisplayName("番組名")]
    public bool TvName { get; set; }

    [DisplayName("アニメフラグ")]
    public bool IsAnime { get; set; }
  }


このような検索項目のチェックボックスと結果一覧を含めた「SearchTvView」というモデルを作っており、
結果の一覧を「PagedList」でページングしようとしています。


■ビュー
  @model xxx.Models.SearchTvView

  <label>
    @Html.CheckBoxFor(m => m.IsAnime, new { @Selected = "Selected" })アニメ
  </label>

  <table class="table">
    <tr>
      <th>
  @Html.ActionLink(Html.DisplayNameFor(model => result.TvId).ToHtmlString(), "Index")
      </th>
    </tr>
    <tr>
      <th>
  @Html.ActionLink(Html.DisplayNameFor(model => result.TvName).ToHtmlString(), "Index")
      </th>
    </tr>
@foreach (var item in Model.Results)
{
    <tr>
  <td>
  @Html.DisplayFor(modelItem => item.TvId)
      </td>
      <td>
  @Html.DisplayFor(modelItem => item.TvName)
      </td>
    </tr>
}
  </table>



このビューの「@model」のところで、「PagedList」を使う為に、
以下のように一覧でバインドされているモデルを宣言する必要があるようなのですが、
そうするとSearchTvViewのプロパティを認識することができず、エラーとなっていまいます。

@model PagedList.IPagedList<xxx.Models.SearchTvView.TvItemsView>
@using PagedList.Mvc

元々の
@model xxx.Models.SearchTvView
を宣言した状態で、xxx.Models.SearchTvView.TvItemsViewに対するPagedListを使用することはできないのでしょうか?

そもそもGETパラメータをモデルで受け取るやり方が一般的ではないのでしょうか?

宜しくお願い致します。


引用返信 編集キー/
■96069 / inTopicNo.2)  Re[1]: 一覧がモデルのいちプロパティの場合でのPagedList使用
□投稿者/ WebSurfer (2132回)-(2020/10/19(Mon) 21:28:02)
No96068 (はる さん) に返信

チュートリアル通りにやれば期待通りになるのですか?

では、チュートリアルと質問者さんのコードはどこが違うのですか? それを、閲覧者・回答者
が見て、違いを調べて、何がどうなってうまくいかないかを書いてくれと言ってます?

ちょっとそれは閲覧者・回答者には負担が大きすぎると思うのですが・・・
引用返信 編集キー/
■96074 / inTopicNo.3)  Re[2]: 一覧がモデルのいちプロパティの場合でのPagedList使用
□投稿者/ はる (40回)-(2020/10/19(Mon) 23:45:13)
No96069 (WebSurfer さん) に返信

すみません。。情報不足で結果的に丸投げのような形になってしまいました。
改めて説明させてください。

ソートまではチュートリアルと同様のコードでうまく行ったのですが、そこから自分のコードにカスタマイズしてしまい、
チュートリアルのページングまでは試せておりませんでした。

チュートリアルとは項目も変えてしまったので結果実現したい機能をお伝えする意図で載せていました。
チュートリアルとの違いとしては、ビューにバインドしているモデル(SearchTvView)が、検索で使用するパラメータ入力項目も含んでいるのと、
一覧に使用する別のモデル(TvItemView)をプロパティとして格納している点となります。

言葉ではうまく伝わらないかもしれないので、画面のイメージで記載しますと、
以下となります。
========================
検索キーワード:●●●

[検索実行ボタン]

結果一覧:
テレビID  番組名       アニメフラグ
1      アニメA       true
2      ドキュメンタリーA  false
3      ニュースA      false

<< 1 2 >> ←ページングを追加したい
========================

モデルのイメージは一番上にも記載したのですが、以下のようになっています。

public class SearchTvView          //ビューにバインドしているクラス
  {
    [DisplayName("ソート順")]
    public string SortOrder { get; set; }

    [DisplayName("アニメフラグ")]
    public bool IsAnime { get; set; }

    [DisplayName("結果一覧")]
    public List<TvItemView> TvItemsView { get; set; }  ←下記のモデルを一覧として格納しするプロパティ
  }

public class TvItemView           //このクラスは一覧画面表示用
  {
    [DisplayName("テレビID")]
    public string TvId { get; set; }

    [DisplayName("番組名")]
    public bool TvName { get; set; }

    [DisplayName("アニメフラグ")]
    public bool IsAnime { get; set; }
  }


この状態で、ビュー側で本来PagedListを使う際の以下のような「@model指定」で、
「SearchTvView」を指定できないものか考えたのですが、自力で解決できなかったので質問させて頂きました。
@model PagedList.IPagedList<xxx.Models.SearchTvView.SearchTvView>

実際の検索条件は多数あり、パラメータもモデルで管理したほうがスッキリするかと思い、このようなモデル定義にしています。







引用返信 編集キー/
■96079 / inTopicNo.4)  Re[3]: 一覧がモデルのいちプロパティの場合でのPagedList使用
□投稿者/ WebSurfer (2133回)-(2020/10/20(Tue) 09:28:58)
No96074 (はる さん) に返信

> ソートまではチュートリアルと同様のコードでうまく行ったのですが、そこから自分のコードにカスタマイズしてしまい、
> チュートリアルのページングまでは試せておりませんでした。

それではチュートリアルのページングの仕組みが理解できてなくて、この先ここで話をしても
話が通じないのでは?

まずはチュートリアル通りに実装してください。話がそれからだと思います。

(チュートリアルのページングの仕組みが理解できてなくて、そもそもできないことをやろうと
している感じ。とすると、話を進めてもお互い時間と労力の無駄になりそうな気がします)


なお、参考にしているチュートリアルは MVC4 + EF5 時代のもののようですが、MVC5 + EF6 の
ものが出ていますので、そちらでやってください。

MVC 5 を使用する Entity Framework 6 Code First の概要
https://docs.microsoft.com/ja-jp/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/

上のチュートリアルの内、以下の 3 番目まで実装してみてください。

・Entity Framework データ モデルを作成する
・基本 CRUD 機能を実装する
・並べ替え、フィルター処理、ページング

3 番目までできると、質問者さんのやり方ではできない理由が分かって、自己解決できるかも。
引用返信 編集キー/
■96080 / inTopicNo.5)  Re[4]: 一覧がモデルのいちプロパティの場合でのPagedList使用
□投稿者/ はる (41回)-(2020/10/20(Tue) 11:23:00)
No96079 (WebSurfer さん) に返信

ありがとうございます。
新しいチュートリアルがあったんですね。
それではこちらを試してみます。

と言っても、仰る通り自分でも出来ない相談だという気がしています。
チュートリアルやってみて出来ないことが分かれば、
パラメータ用のモデルを使わず、素直に一覧用のモデルだけでバインドすることを検討します。

一旦質問はクローズします。
引用返信 編集キー/
■96081 / inTopicNo.6)  Re[5]: 一覧がモデルのいちプロパティの場合でのPagedList使用
□投稿者/ WebSurfer (2134回)-(2020/10/20(Tue) 11:44:07)
No96080 (はる さん) に返信

> と言っても、仰る通り自分でも出来ない相談だという気がしています。
> チュートリアルやってみて出来ないことが分かれば、
> パラメータ用のモデルを使わず、素直に一覧用のモデルだけでバインドすることを検討します。

TvItemView は部分ビューを使って表示するようにすれば PagedList が使えるかもしれま
せん(未検証・未確認ですが)。

諦める前にそれも検討してはいかがですdか?
引用返信 編集キー/
■96092 / inTopicNo.7)  Re[5]: 一覧がモデルのいちプロパティの場合でのPagedList使用
□投稿者/ WebSurfer (2135回)-(2020/10/21(Wed) 11:43:35)
No96080 (はる さん) に返信

> 一旦質問はクローズします。

Q&A は止めるなら「解決済み」マークを付けてください。自分がかかわったスレッドがいつまでもオープン
になっているのは気になります。諦めて方針変更=解決ということでも良いのでは?


引用返信 編集キー/
■96101 / inTopicNo.8)  Re[6]: 一覧がモデルのいちプロパティの場合でのPagedList使用
□投稿者/ はる (42回)-(2020/10/21(Wed) 16:22:19)
No96092 (WebSurfer さん) に返信
> Q&A は止めるなら「解決済み」マークを付けてください。自分がかかわったスレッドがいつまでもオープン
> になっているのは気になります。諦めて方針変更=解決ということでも良いのでは?

申し訳ありません。「解決済み」チェックを付けたつもりが付いてませんでした。。
その後ですが、チュートリアルも問題なくでき、自分のアプリでもパラメータ用のモデルを使わなければ出来るところまで確認できました。
やっていることも理解できたつもりです。

PagedListにモデルを渡している部分で「SearchTvView.TvItemsView」プロパティをキャストして渡すなどすれば〜、などと試してみたいことはありますが、
今回は余裕も無い為、パラメータ用のモデルを使わずチュートリアルと同じやり方で進める方向になりました。

部分ビューも次回のアプリで試してみたいと思います。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -