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

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

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

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

ASP.NET

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

Q&A

解決済

1回答

14539閲覧

MVCでViewからControllerへのDatatableの受け渡しについて

Yuki_S

総合スコア356

MVC

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

ASP.NET

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

0グッド

0クリップ

投稿2016/05/19 01:35

###前提・実現したいこと
MVCでアプリケーションを作成した際に自動生成されるAccountに対して、role(役割)を付加して[Authorize(Roles = "Admin,Editor")]などが使える状態にしています。
管理者権限を持っているユーザーが他のユーザーに権限を割り当てるページを作成したいのですが、各ユーザーごとに編集ページに遷移するのはユーザーの数が増えると非常に使い勝手が悪くなると思い、今回は一括で編集できるようなページを作成しようとしています。(下図イメージ)

イメージ説明

この登録のボタンを押した際にデータがサーバーに反映されて、ページが更新される仕様にしたいを実装したいです。

###発生している問題・エラーメッセージ
データベースの各テーブルから必要なデータを取得して、各ユーザーの社員番号とどの権限を持っているかをテーブルに表記することはできましたが、登録ボタン押下時にControllerへテーブルにした情報をDataTableなどにして返す方法がわかりませんでした。

###該当のソースコード
Controller

public ActionResult Index(DataTable strmodel) { テーブルに情報があれば内容を精査してデータベースに書き込みを行う。 DataTable tb = new DataTable(); var Manager = new RoleManager<ApplicationRole>(new RoleStore<ApplicationRole>(new ApplicationDbContext())); var models = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); System.Type TpStr = typeof(string); System.Type Tpbool = typeof(bool); tb.Columns.Add(new DataColumn("社員番号", TpStr)); foreach (ApplicationRole role in Manager.Roles) { tb.Columns.Add(new DataColumn(role.Name, Tpbool)); } var dr = tb.NewRow(); foreach (var model in models.Users) { dr["社員番号"] = model.UsId; foreach (ApplicationRole role in Manager.Roles) { var Usrole = role.Users.Select(a => a.UserId).ToList(); if (Usrole.Contains(model.Id.ToString())) { dr[role.Name] = true; } else { dr[role.Name] = false; } } tb.Rows.Add(dr); } return View(tb); } }

view

@using (Html.BeginForm("Index", "Account", FormMethod.Get, new { @class = "form-inline" })) { <table class="table"> <tr> @foreach (var item in Model.Columns) { <th> @item.Caption </th> } </tr> @foreach (System.Data.DataRow item in Model.Rows) { <tr> @{ count = item.ItemArray.Count(); } @for (var i = 0; i < count; i++) { <td> @if (item.ItemArray[i].GetType() == typeof(string)) { @item.ItemArray[i] } else { @Html.CheckBox((string)Model.Columns[i].Caption, (bool)item.ItemArray[i]) } </td> } </tr> } </table> <div class="form-group"> <input type="submit" class="btn btn-default" value="登録" /> </div> }

###試したこと
View側の情報をViewbagに格納してみたりしましたが、チェックボックスの編集後の情報が入ってこないなどの状況です。

説明など拙いところがあるかと思いますが、助けていただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちわ、ボタンクリック後、Controllerに処理が渡るけど、Modelに入っていないということでしょうか。可能であればModelも載せていただけるとありがたいです。
以下、tableタグ内にチェックボックスを配置し、ボタンクリックでControllerに渡っています。(VisualStudioのデフォルトのアプリケーションに少し手を加えただけなので見難くて申し訳ありません)
View

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() @Html.ValidationSummary("", new { @class = "text-danger" }) <table class="table"> <tr> <td> <div class="form-group"> <div class="col-md-10"> @Html.CheckBoxFor(m => m.IsCheck, new { @class = "form-control" }) </div> </div> </td> </tr> </table> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" class="btn btn-default" value="登録" /> </div> </div> }

Model

[Required] [Display(Name = "Check")] public bool IsCheck { get; set; }

Controller

public async Task<ActionResult> Register(RegisterViewModel model) { ・ ・ ・

ASP.NET MVCのモデルバインド周りは、はまったら悩ましいですよね。参考になれば幸いです。

投稿2016/05/20 08:59

編集2016/05/20 09:03
f_horizon

総合スコア163

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

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

Yuki_S

2016/05/23 08:07

ご回答ありがとうございました。 まずはしようもないところで、FormMethod.PostをGetにしていました。 ModelはAccountのものをほぼそのまま使っており、変更を特に加えていません。 その為、サーバーのテーブルを見るとUserのテーブルとUserRoleのテーブルの二つに分かれていました。よって、チェックボックスを受け渡すためにクラスを作成して、テーブル内のデータを受け取り、各チェックボックスの結果をもとに UserManager.AddToRoles(); のメソッドを使って役割の編集ができるようになりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問