前提・実現したいこと
ASP.NET MVC5 で掲示板を作成している初学者です。
スレッドでレスを投稿をする際にASP.NET Identityで獲得したユーザーIdやレスを返そうとしているスレッドのIdを初期値として持ったままレスをできるようにしたいと考えましたが、うまくいかないので投稿しました。
(コード添付に当たって、全体を貼った後に自分で書き直したところ等をまとめています)
発生している問題・エラーメッセージ
スキャフォールディングしたままの状態では、次のような見栄えになっています。
この状態では、誰がレスを書き込むのかを示すResOwneridがデータベース中にある全件がドロップダウンリストで表示されてしまいます。そこで、ResOwnerIdをTextBox等に変更して初期値を現在ログインしているユーザーIdにすることはできないか、と思い投稿しました。
以前、同じような質問をしたのですが、TextBoxに値は入ったもののそのあとsubmitしてもうまくDBに値が反映されなかったため再度投稿しました。
(ちなみに問題解決時に、TextBoxのname属性に問題があったためにバインディングがうまくいかなかったのだろうということが推定できました)
https://teratail.com/questions/135216
現在、上記Urlの教えを取り込み、コードを書きなおしたところ、次のようになりました。
添付画像中のテキストボックスに入っている6aa・・・の文字列はResOwnerIdのEditor欄に初期値として入って欲しいASP.NET Identityで設定したログイン中のUserIdです。
(この時点では、Textboxではモデルを経由してデータベースに書き込むすべはないのであろうと考えていたため、EditorForにこだわっていました。)
該当のソースコード と 試したこと
ControllerとViewの該当部分を記します。(Modelはどこをはるかわからなかったので指摘あれば貼ります)
Controller(2行目の"int? Id"のIdには、スレタイをクリックした際に渡される、スレッドのIdが含まれる予定です。)
c#
1 // GET: Responses/Create 2 public ActionResult Create(int? Id) 3 { 4 var UserId = User.Identity.GetUserId(); 5 ViewBag.ResOwnerId = UserId; 6 // ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "Email"); 7 ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title"); 8 return View(); 9 }
View(SortNoは見やすさと文字数の関係で省略してます)
C#
1 2@using (Html.BeginForm()) 3{ 4 @Html.AntiForgeryToken() 5 6<div class="form-horizontal"> 7 <h4>Responses</h4> 8 <hr /> 9 @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 10 11 <div class="form-group"> 12 @Html.LabelFor(model => model.TopicId, "TopicId", htmlAttributes: new { @class = "control-label col-md-2" }) 13 <div class="col-md-10"> 14 @Html.DropDownList("TopicId", null, htmlAttributes: new { @class = "form-control" }) 15 @Html.ValidationMessageFor(model => model.TopicId, "", new { @class = "text-danger" }) 16 </div> 17 </div> 18 19 20 <div class="form-group"> 21 @Html.LabelFor(model => model.Contents, htmlAttributes: new { @class = "control-label col-md-2" }) 22 <div class="col-md-10"> 23 @Html.EditorFor(model => model.Contents, new { htmlAttributes = new { @class = "form-control" } }) 24 @Html.ValidationMessageFor(model => model.Contents, "", new { @class = "text-danger"}) 25 </div> 26 </div> 27 28 <div class="form-group"> 29 @Html.LabelFor(model => model.ResOwnerId, "ResOwnerId", htmlAttributes: new { @class = "control-label col-md-2" }) 30 <div class="col-md-10"> 31 @Html.EditorFor(model => model.ResOwnerId, new { htmlAttributes = new { @class = "form-control", value = ViewBag.ResOwnerId } }) 32 @Html.ValidationMessageFor(model => model.ResOwnerId, "", new { @class = "text-danger" }) 33 </div> 34 </div> 35 @Html.TextBox("username", (string)ViewBag.ResOwnerId, new { @class = "form-control" }) 36 37 38 <div class="form-group"> 39 <div class="col-md-offset-2 col-md-10"> 40 <input type="submit" value="Create" class="btn btn-default" /> 41 </div> 42 </div> 43</div> 44} 45
以上のうち、Controllerは次のように記すことによって、ResOwnerIdに現在ログイン中のユーザーIdを格納しました。(ViewのTextBoxでユーザーIdを表示できました。)
c#
1 var UserId = User.Identity.GetUserId(); 2 ViewBag.ResOwnerId = UserId;
また、ViewはResOwneridについて、
c#
1 @Html.DropDownList("ResOwnerId", null, htmlAttributes: new { @class = "form-control" })
を次のように修正しました。その結果、EditorForは空欄でvalueとしてResOwnerIdが格納されませんでした。(TextBoxにResOwnerIdは表示されたので、ViewBag.ResOwnerIdに値はControllerから渡されていると考えています。)
C#
1 @Html.EditorFor(model => model.ResOwnerId, new { htmlAttributes = new { @class = "form-control", value = ViewBag.ResOwnerId } })
補足情報(FW/ツールのバージョンなど)
VS2017
Windows7
.Net Framework 4.6.1
MVC5
問題解決がEditorForではなく、TextBoxでも行うことができたため、質問の内容を修正しました。
TextBoxではなくEditorForでも行えるとは思うので、出来次第再度加筆しようとおもいます。
回答2件
あなたの回答
tips
プレビュー