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

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

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

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

MVC

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

ASP.NET

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

Q&A

解決済

1回答

3406閲覧

View画面のDropDownListの値の固定と先頭のブランクについて

pomu.pomupomu

総合スコア18

C#

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

MVC

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

ASP.NET

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

0グッド

0クリップ

投稿2018/07/09 09:41

編集2018/09/30 05:31

ASP.NET mvc5 を用いて、掲示板を作成している初学者です。
質問に対する回答、いつもありがとうございます。

前提・実現したいこと

DBfirstでの"ADO.NET Entity Data Model"の作成機能を用いてModelを作成し、スキャフォールディング機能を用いてViewとControllerの自動生成をしました。

その後、ASP.NET identityを用いて実装したログイン機能を基に、トピックの中のレスの作成をしているのですが、行き詰まったので質問を投稿しました。

発生している問題・エラーメッセージ

次の画像はトピックの中のレスを新規に作成するためのページなのですが、以下の問題を抱えています。

(1) レスの記入者を現在ログインしているユーザー名で固定したいが、ユーザー名をすべて表示してしまう。また、世の中の目標制作物に類似するものはそもそも「記入者=ログインユーザー名」だというのが自明なので表示してないように思えるので表示しない方法もあればご教授いただけたら幸いです。

該当のソースコード

Controller

C#

1 // GET: Responses/Create 2 public ActionResult Create() 3 { 4 string id = User.Identity.GetUserId(); 5 string name = User.Identity.GetUserName(); 6 ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "UserName"); 7 8 ViewBag.ResId = new SelectList(db.Responses, "Id", "Title"); 9 ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title"); 10 return View(); 11 // return Content(id + name); 12 } 13 14 // POST: Responses/Create 15 // 過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。 16 // 詳細については、https://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。 17 [HttpPost] 18 [ValidateAntiForgeryToken] 19 public ActionResult Create([Bind(Include = "Id,")] Responses responses) 20 { 21 if (ModelState.IsValid) 22 { 23 db.Responses.Add(responses); 24 db.SaveChanges(); 25 return RedirectToAction("Index"); 26 } 27 28 ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "Email", responses.ResOwnerId); 29 ViewBag.ResId = new SelectList(db.Responses, "Id", "Title", responses.ResId); 30 ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title", responses.TopicId); 31 return View(responses); 32 }

View

C#

1@model AlbatrossOnClouds.Models.Responses 2 3@{ 4 ViewBag.Title = "Create"; 5} 6 7<h2>Create</h2> 8 9 10@using (Html.BeginForm()) 11{ 12 @Html.AntiForgeryToken() 13 14 <div class="form-horizontal"> 15 <h4>Responses</h4> 16 <hr /> 17 @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 18 19 <div class="form-group"> 20 @Html.LabelFor(model => model.TopicId, "トピック名", htmlAttributes: new { @class = "control-label col-md-2" }) 21 <div class="col-md-10"> 22 @Html.DropDownList("TopicId", null, htmlAttributes: new { @class = "form-control" }) 23 @Html.ValidationMessageFor(model => model.TopicId, "", new { @class = "text-danger" }) 24 </div> 25 </div> 26 27 28 </div> 29 30 31 32 <div class="form-group"> 33 @Html.LabelFor(model => model.Contents, htmlAttributes: new { @class = "control-label col-md-2" }) 34 <div class="col-md-10"> 35 @Html.EditorFor(model => model.Contents, new { htmlAttributes = new { @class = "form-control" } }) 36 @Html.ValidationMessageFor(model => model.Contents, "", new { @class = "text-danger" }) 37 </div> 38 </div> 39 40 41 <div class="form-group"> 42 @Html.LabelFor(model => model.ResOwnerId, "レスの記入者", htmlAttributes: new { @class = "control-label col-md-2" }) 43 <div class="col-md-10"> 44 45 @Html.DropDownList("ResOwnerId", null, htmlAttributes: new { @class = "form-control" }) 46 @Html.ValidationMessageFor(model => model.ResOwnerId, "", new { @class = "text-danger" }) 47 48 </div> 49 </div> 50 51 52 <div class="form-group"> 53 <div class="col-md-offset-2 col-md-10"> 54 <input type="submit" value="Create" class="btn btn-default" /> 55 </div> 56 </div> 57 </div> 58} 59 60<div> 61 @Html.ActionLink("Back to List", "Index") 62</div> 63 64@section Scripts { 65 @Scripts.Render("~/bundles/jqueryval") 66} 67

試したこと

(1)
Controllerを次のように書き換えたところ、次の画像のようにViewで表示されるDropDownListの中身がChar型になってしまいます。
return contentを用いてidとnameを表示した時にはハッシュ値のパスとユーザー名が表示できたのでidとnameには問題がないのではと考えています
(idとnameにIdentityの情報を格納し、Viewbag.ResOwnerId の値をコメントアウトしている行からその次の行のように書き換えました)

c#

1 // GET: Responses/Create 2 public ActionResult Create() 3 { 4 string id = User.Identity.GetUserId(); 5 string name = User.Identity.GetUserName(); 6 //ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "UserName"); 7 ViewBag.ResOwnerId = new SelectList(id); 8 9 ViewBag.ResId = new SelectList(db.Responses, "Id", "Title"); 10 ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title"); 11 return View(); 12 }

補足情報(FW/ツールのバージョンなど)

Windows7
VS2017
ASP.NET MVC5
Net Framework 4.6.1

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/07/09 11:19

はっきり言って長すぎます。読む気力がわいてきません。何とかなりませんか? 一番聞きたいことに絞るとか・・・
退会済みユーザー

退会済みユーザー

2018/07/12 10:00

少しは質問の仕方を改善していただけると期待していましたが、その気なしですか? であれば、自分はお役に立てそうもないのでこのスレッドからは撤退します。何か一言返事があってもいいと思うのですが。
pomu.pomupomu

2018/07/13 04:17 編集

すみません、質問しておいて私情を記すのが大変申し訳ないのですが、大学のレポートと試験に追われてて気が参ってました。類似箇所だからまとめた方がいいかと思ったのでこうしてましたすみません。質問内容を大幅に減らして投稿し直します。
guest

回答1

0

ベストアンサー

(1) レスの記入者を現在ログインしているユーザー名で固定したいが、ユーザー名をすべて表示してしまう。

Controller のソースの db というのが何だか不明ですが、結果からすると db.AspNetUsers で DB のテーブル AspNetUsers にある全てのユーザー情報を取得しているようですね。

それをアクションメソッドで、

ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "UserName");

として、View で、

@Html.DropDownList("ResOwnerId", null, htmlAttributes: new { @class = "form-control" })

としているので、DropDownList に、DB のテーブル AspNetUsers にあるすべてのユーザーの UserName 一覧が、ドロップダウン形式で表示されるのは当然の結果ですよね?

そもそも、何故 DropDownList などを使ったのですか? 「ユーザー名で固定したい」=「ログインしているユーザー名だけを表示したい」と理解していますが、であれば、DropDownList を使うという発想にならないはずです。

普通のテキストボックスを使って、現在ログインしているユーザー名を、それに表示できればいいのですよね?

であれば、string name = User.Identity.GetUserName(); の name には目的のユーザー名を取得できているそうなので、その name を、例えば ViewBag.ResOwnerName = name; というように ViewBag に渡し、それを View で DropDownList に代えて、

@Html.TextBox("username", (string)ViewBag.ResOwnerName, new { @class = "form-control" })

などで表示すればよさそうです。

また、世の中の目標制作物に類似するものはそもそも「記入者=ログインユーザー名」だというのが自明なので表示してないように思えるので表示しない方法もあればご教授いただけたら幸いです。

標準のテンプレートとそれに実装されている _Layout.cshtml を使えば、画面の右上にユーザー名が表示されるはずですが、それでよさそうな気がしますけど?

ただし、[Create] ボタンをクリックして DB に INSERT する際、それにユーザー名を含める必要がある場合は、[HttpPost] を付与したアクションメソッドで何らかの手段でユーザー名を取得する必要があります。(Id も必要ならそれも)

Controllerを次のように書き換えたところ、次の画像のようにViewで表示されるDropDownListの中身がChar型になってしまいます。

上記のことが理解できれば、「Char型になってしまいます」の解決策を議論する必要なないですよね?

投稿2018/07/13 06:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pomu.pomupomu

2018/07/14 12:44

ScaffoldingするさいにDropDownListで表示されていたので、「それならば迂闊にいじると壊しかねないし、DropDownlistの値を一つにしてしまえば実質固定では・・・!」なんて思っていました。 また、名前をDBにInsertすることで掲示板に誰が書き込んだのかを明示する必要があったので考えていた次第です。それに対する返答もありがとうございます・・・! string id = User.Identity.GetUserId(); string name = User.Identity.GetUserName(); の2つで取得自体はできているので試してみようと思います。 無礼を働いてしまったにも関わらず丁寧な回答をありがとうございました。
退会済みユーザー

退会済みユーザー

2018/07/15 00:41

> ScaffoldingするさいにDropDownListで表示されていたので そのようになるというのは、DB の設計からマズイところがあるからではないかと思います。 全体的な Web アプリの構成を考えるところから始まって、そのアプリのデータのストアとなる DB をどう作るか、きちんと考えてみることをお勧めします。 いろいろ試行錯誤しながら DB を含めた全体を作って行くなら、DB First より Code First の方が良いかもしれません。 例としては、MVC3 でちょっと古いのが何ですが、以下の記事が良いと思います。 連載:ASP.NET MVC入門【バージョン3対応】 http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/index/index.html この記事の「第2回 Entity Frameworkコード・ファーストでモデル開発」を見てください。 その記事の Books をトピック、Reviews をレスと考えてまずそれをベースに基本的なところを実装し、それを質問者さんのやりたいことに合わせて拡張していくことを考えるのがよさそうです。
pomu.pomupomu

2018/07/23 10:04

とても返信が遅くなりすみません。 データベースの設計については、経験不足の面からもかなり問題があるのでは・・・と危惧しています。 正直、モノをなんとなく考えておそらく必要なのはここであろう、だからこうであろうという感じでDBを作っていました。 正直、その点DBとCodeどちらを優先するかの観点で悩んでたので助言ありがたいです。Codefirstでも作成してみます。 また、教えていただいた記事についても「こういうの読みたかった!!!」って感じでしてめっちゃ歓喜しています。ありがとうございます! わかりました。一気に色々手をつけずに、まずは骨組み(?)となる大事な部分を教えをもとにしてみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問