質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

1回答

9143閲覧

2つのプルダウンを連動したドロップダウンリストを作成したい(HierSelect)

hayato208

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2020/08/18 13:12

編集2020/08/19 01:53

実現したいこと

・「カテゴリ」「教科名」2つのドロップダウンリストがあり、「カテゴリ」が変更されるとそれに対応した「教科名」が「教科名」ドロップダウンリストにて選択できる。
・「カテゴリ」ドロップダウンリストが初期状態だと「教科名」ドロップダウンリストは選択できない。
下記サイトを参考にDB Firstにて作成をしています。
.NET アプリケーション開発入門

DBは「Categories」テーブル:CategoryID/CategoryName
「subjects」テーブル:SubjectID/SubjectName/CategoryID
です。
最終的にはQUestionID(連番),SubjectID(),question,Answer,Isdelete(最後3つはユーザーによる入力、下記コードには載せていない)を「Questions」テーブルに保存したいと考えております。

修正依頼に対する追記

・タイトルにある「HierSelect」ですが、2つの連動したプルダウンのことを指しております。
例えば大カテゴリの選択(今回の「カテゴリ」)によって中カテゴリ(今回の「教科名」)の内容を変更する処理のことを指します。
・class属性を用いて2つのプルダウンを連動したいと考えております。
現状では2つのプルダウンを<option value=>にて連動しておりますが、これでは教科名のID(SubjectID)が取得できません。
なのでclass属性でプルダウン連動、option属性の値をSubjectIDに追加したいと考えております。

現状

「カテゴリ」「教科名」ドロップダウンリストにてともにCategoryIDを用いて連動しているため連動自体はうまく行っている。
ただ、SubjectIDをどうやって関連付けるかが分からない。

根本的にViewBagではclass属性は付与できないのか(jsのコードを修正しないとダメなのか)すら分かっていないので、違う方法等あれば教えていただきたいです。

発生している問題

ViewBagにてvalue属性は設定できるが、class属性が設定できない。
例えば【jQuery】3つのプルダウンを連動させるプラグイン『jquery.tgHierSelect』を作ってみたにあるような

<option value="4" class="p1">

としたい。
下記コードのViewBagにて渡せているのは

<option value="4">

のみである。

該当のソースコード

Controller

1 // GET: Question/Create 2 public ActionResult Create() 3 { 4 // ドロップダウンリスト用 5 ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "CategoryName"); 6 ViewBag.SubjectID = new SelectList(db.subjects, "CategoryID", "SubjectName"); // CategoryIDとSubjectIDを渡したい 7 return View(); 8 } 9 10 // POST: Question/Create 11 // 過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。 12 // 詳細については、https://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。 13 [HttpPost] 14 [ValidateAntiForgeryToken] 15 public ActionResult Create([Bind(Include = "QuestionID,SubjectID,question,Answer,Isdelete")] questions questions) 16 { 17 if (ModelState.IsValid) 18 { 19 db.questions.Add(questions); 20 db.SaveChanges(); 21 return RedirectToAction("Index"); 22 } 23 24 return View(questions); 25 }

View

1 <div class="editor-field"> 2 @Html.DropDownList("CategoryID", null, "カテゴリを選択して下さい。", new { id = "CategoryName" }) 3 </div> 4 <div class="editor-label"> 5 課題名 6 </div> 7 <div class="editor-field"> 8 @Html.DropDownList("SubjectID", null, "教科名を選択して下さい。", new { id = "SubjectName" }) 9 </div> 10 } 11 <script type="text/javascript"> 12 $(function () { 13 // カテゴリ名 14 var SubjectNam = $("#SubjectName"); 15 16 // 教科名のoption内容をコピー 17 var pd2 = $("#SubjectName option").clone(); 18 19 // カテゴリドロップダウンリストが変更されたら作動 20 $("#CategoryName").change(function () { 21 // 教科名をeabled 22 SubjectNam.removeAttr('disabled'); 23 24 // カテゴリ名のvalue取得 25 var lv1val = $("#CategoryName").val(); 26 27 // 一旦、カテゴリ名のoption削除 28 $("#SubjectName option").remove(); 29 30 // コピー元のカテゴリを表示 31 $(pd2).appendTo("#SubjectName"); 32 33 // 選択値以外のoption削除 34 $("#SubjectName option[value != " + lv1val + "]").remove(); 35 36 // カテゴリドロップダウンリストを2回目以降操作時、カテゴリ名が未選択なら教科をdisabledにする 37 if ($("#CategoryName").val() == "") { 38 SubjectNam.attr('disabled', 'disabled'); 39 } 40 }); 41 42 // カテゴリ名が未選択なら教科をdisabledにする 43 if ($("#CategoryName").val() == "") { 44 SubjectNam.attr('disabled', 'disabled'); 45 } 46 }); 47 48 </script> 49

CategoriesModel

1namespace QuestionManager.Models 2{ 3 using System; 4 using System.Collections.Generic; 5 6 public partial class Categories 7 { 8 public int CategoryID { get; set; } 9 public string CategoryName { get; set; } 10 public bool IsDelete { get; set; } 11 } 12}

SubjectsModel

1namespace QuestionManager.Models 2{ 3 using System; 4 using System.Collections.Generic; 5 6 public partial class subjects 7 { 8 public int SubjectID { get; set; } 9 public string SubjectName { get; set; } 10 public Nullable<int> CategoryID { get; set; } 11 } 12}

開発環境

ASP.NET MVC5.2.4
Entity Framework 6.2.0
jQuery 3.3.1
Identity.Entity.Framework 2.2.2
DB:SQL Sever

補足

タイトルにある「HierSelect」ですが、2つの連動したプルダウンのことを指しております。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/18 22:22 編集

参考サイトは url の文字列を記載するだけでなくリンクを張ってください。 HierSelect とはなんですか? 質問に、 > 例えばリンク先にあるような とありますが、class 属性を使ってクライアントスクリプトで何かする? 「リンク先」に詳しく書いてある? それはどこですか?
hayato208

2020/08/19 01:59

質問を修正しましたのでお手数ですが確認お願いいたします。 urlはリンクで貼り付けました。 HierSelectは連動プルダウンのことです。タイトルの修正も考えましたが質問文はともかくタイトルはあまり修正しないほうがいいかと思い質問文中に補足事項として載せておきました。 > 例えばリンク先にあるような 申し訳ございません、リンクが抜けておりましたので修正しました。 > class 属性を使ってクライアントスクリプトで何かする? class属性は2つのプルダウンの連動のために使用しております。連動のために必要なのでclassである必要はなくカスタムデータでも問題ないです。
退会済みユーザー

退会済みユーザー

2020/08/19 03:47 編集

> ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "CategoryName"); > ViewBag.SubjectID = new SelectList(db.subjects, "CategoryID", "SubjectName"); ユーザーが送信してくるのは、ユーザーが 2 つの DropDownList から選択した CategoryID と SubjectID でなければならないのですよね? 上のコードでは 2 つとも CategoryID になってしまうと思いますが? 要するに、2 つめの DropDownList から生成される select 要素下の option 要素を以下のようにすれば、後は質問者さんがクライアントスクリプトを書いて何とかできるということで良いのですか? <option value="1" class="p1">xxx</option> 上で value="1" の 1 は SubjectID、xxx は SubjectName、class="p1" の 1 は CategoryID
退会済みユーザー

退会済みユーザー

2020/08/20 03:48

質問者さん、無言になってしまいましたが、すでに回答していますのでそれに対するフィードバックを返してください。役に立った・立たなかった程度のフィードバックはすぐ返せるはず。役に立たなかったならどこがダメだったのかも書いてください。とにかく無言は NG です。 もし、回答の下の方に書いた「2 つ目の DropDownList に表示するデータのみを ajax を使って取得して表示する」という方向に方針変更するならその旨書いてください。
guest

回答1

0

ベストアンサー

ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "CategoryName");
ViewBag.SubjectID = new SelectList(db.subjects, "CategoryID", "SubjectName");

ユーザーが送信してくるのは、ユーザーが 2 つの DropDownList から選択した CategoryID と SubjectID でなければならないのですよね? 上のコードでは 2 つとも CategoryID になってしまうと思いますが?

要するに、2 つめの DropDownList から生成される select 要素下の option 要素を以下のようにすれば、後は質問者さんがクライアントスクリプトを書いて何とかできるということで良いと理解してレスします。

<option value="1" class="p1">xxx</option>

: 上で、各属性の値は「subjects」テーブルより取得し、value="1" の 1 は SubjectID、xxx は SubjectName、class="p1" の 1 は CategoryID と理解しています。

SelectList を Html ヘルパーの DropDownList に渡すやり方では CategoryID が渡せません。

なので、アクションメソッドから View に渡すのは、上に引用したコードの 2 行目のような SelectList ではなく db.subjects を渡して、View 側のコードで db.subjects から SubjectID、SubjectName、CategoryID を取得して option 要素の文字列を組み立てるのがよさそうです。

質問者さんの前のスレッド https://teratail.com/questions/285121 で私の回答で紹介した Northwind サンプルデータベースの Categories テーブルと Products テーブル(下の画像参照)を使って作った EDM をベースに例を書いておきます。

イメージ説明

上の画像で Categories が質問者さんの DB の「Categories」テーブル、Products が「subjects」テーブルと思ってください。

Controller / Action Method

イメージ説明

View

イメージ説明

Html

イメージ説明

この先、連動させるためのスクリプトの書き方はご自分で考えて対応願います。

スクリプトの書き方が分からなければ、ASP.NET の話ではなくて JavaScript / jQuery の話として別に新たなスレッドを立てて質問するか、それが難しければ以下のように方針変更することをお勧めします。

質問者さんがこのスレッドで書かれているやり方は、一度に全部のデータを取得してきてクライアント側で JavaScript / jQuery を使って操作するということですが、そうではなくて、せっかく ASP.NET MVC を使っているのですから、2 つ目の DropDownList に表示するデータのみを ajax を使って取得して表示するという方がスマートだと思います。

asp.net mvc cascading dropdownlist などをキーワードにググると参考になる記事がヒットします。例えば下記:

An ASP.NET MVC Cascading Dropdown List
https://www.codeproject.com/Tips/883701/An-ASP-NET-MVC-Cascading-Dropdown-List

自分でも検索して調べてみてください。

投稿2020/08/19 04:27

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayato208

2020/08/20 06:58 編集

返信が遅くなってしまいすみません。 回答してくださった内容で無事実現できました、今回もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問