実現したいこと
・「カテゴリ」「教科名」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つの連動したプルダウンのことを指しております。
回答1件
あなたの回答
tips
プレビュー