質問編集履歴

3 情報の削除

pomu.pomupomu

pomu.pomupomu score 18

2018/09/30 14:31  投稿

View画面のDropDownListの値の固定と先頭のブランクについて
ASP.NET mvc5 を用いて、掲示板を作成している初学者です。
質問に対する回答、いつもありがとうございます。
### 前提・実現したいこと
DBfirstでの"ADO.NET Entity Data Model"の作成機能を用いてModelを作成し、スキャフォールディング機能を用いてViewとControllerの自動生成をしました。
その後、ASP.NET identityを用いて実装したログイン機能を基に、トピックの中のレスの作成をしているのですが、行き詰まったので質問を投稿しました。
### 発生している問題・エラーメッセージ
次の画像はトピックの中のレスを新規に作成するためのページなのですが、以下の問題を抱えています。
 (1) レスの記入者を現在ログインしているユーザー名で固定したいが、ユーザー名をすべて表示してしまう。また、世の中の目標制作物に類似するものはそもそも「記入者=ログインユーザー名」だというのが自明なので表示してないように思えるので表示しない方法もあればご教授いただけたら幸いです。
![イメージ説明](f08ad8c48bf0d5e34d24cc7bcba0a097.png)!  
### 該当のソースコード
Controller
```C#
       // GET: Responses/Create
       public ActionResult Create()
       {
           string id = User.Identity.GetUserId();
           string name = User.Identity.GetUserName();
           ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "UserName");
         
           ViewBag.ResId = new SelectList(db.Responses, "Id", "Title");
           ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title");
           return View();
           // return Content(id + name);
       }
       // POST: Responses/Create
       // 過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。
       // 詳細については、https://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。
       [HttpPost]
       [ValidateAntiForgeryToken]
       public ActionResult Create([Bind(Include = "Id,SortNo,TopicId,ResId,Title,Contents,ResOwnerId,ResponseCount,ViewCount,RecentResDate,CountNice,CountLaugh,CountTears,CountSurprise,CountAnger,HiddenFlag,DeleteFlag,DeleteUserId,DeleteUserIsAdmin,DeleteDate,CreateDate,CreateUserId,CreateUserIsAdmin,UpdateDate,UpdateUserId,UpdateUserIsAdmin")] Responses responses)
       public ActionResult Create([Bind(Include = "Id,")] Responses responses)
       {
           if (ModelState.IsValid)
           {
               db.Responses.Add(responses);
               db.SaveChanges();
               return RedirectToAction("Index");
           }
           ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "Email", responses.ResOwnerId);
           ViewBag.ResId = new SelectList(db.Responses, "Id", "Title", responses.ResId);
           ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title", responses.TopicId);
           return View(responses);
       }
```
View
``` C#
@model AlbatrossOnClouds.Models.Responses
@{
   ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
   @Html.AntiForgeryToken()
   
   <div class="form-horizontal">
       <h4>Responses</h4>
       <hr />
       @Html.ValidationSummary(true, "", new { @class = "text-danger" })
       <div class="form-group">
           @Html.LabelFor(model => model.TopicId, "トピック名", htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.DropDownList("TopicId", null, htmlAttributes: new { @class = "form-control" })
               @Html.ValidationMessageFor(model => model.TopicId, "", new { @class = "text-danger" })
           </div>
       </div>
       <div class="form-group">
           @Html.LabelFor(model => model.ResId, "重ねてレスするタイトル", htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.DropDownList("ResId", null, htmlAttributes: new { @class = "form-control" })
               @Html.ValidationMessageFor(model => model.ResId, "", new { @class = "text-danger" })
           </div>
       
       </div>
       <div class="form-group">
           @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
               @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
           </div>
       </div>
       <div class="form-group">
           @Html.LabelFor(model => model.Contents, htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.EditorFor(model => model.Contents, new { htmlAttributes = new { @class = "form-control" } })
               @Html.ValidationMessageFor(model => model.Contents, "", new { @class = "text-danger" })
           </div>
       </div>
       
       <div class="form-group">
           @Html.LabelFor(model => model.ResOwnerId, "レスの記入者", htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               
              @Html.DropDownList("ResOwnerId", null, htmlAttributes: new { @class = "form-control" })
              @Html.ValidationMessageFor(model => model.ResOwnerId, "", new { @class = "text-danger" })
               
           </div>
       </div>
       
       <div class="form-group">
           <div class="col-md-offset-2 col-md-10">
               <input type="submit" value="Create" class="btn btn-default" />
           </div>
       </div>
   </div>
}
<div>
   @Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
   @Scripts.Render("~/bundles/jqueryval")
}
```
Model  
```c#  
   public partial class Responses  
   {  
       [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]  
       public Responses()  
       {  
           this.Responses1 = new HashSet<Responses>();  
       }  
     
       public int Id { get; set; }  
       public Nullable<int> SortNo { get; set; }       
       public Nullable<int> TopicId { get; set; }  
       public Nullable<int> ResId { get; set; }  
       [Display(Name = "タイトル")]  
       public string Title { get; set; }  
       [Display(Name = "レス内容")]  
       public string Contents { get; set; }  
       [Display(Name = "レスの書き込み者")]  
       public string ResOwnerId { get; set; }  
       public Nullable<int> ResponseCount { get; set; }  
       public Nullable<int> ViewCount { get; set; }  
       public Nullable<System.DateTime> RecentResDate { get; set; }  
       public Nullable<int> CountNice { get; set; }  
       public Nullable<int> CountLaugh { get; set; }  
       public Nullable<int> CountTears { get; set; }  
       public Nullable<int> CountSurprise { get; set; }  
       public Nullable<int> CountAnger { get; set; }  
       public Nullable<bool> HiddenFlag { get; set; }  
       public Nullable<bool> DeleteFlag { get; set; }  
       public Nullable<int> DeleteUserId { get; set; }  
       public Nullable<bool> DeleteUserIsAdmin { get; set; }  
       public Nullable<System.DateTime> DeleteDate { get; set; }  
       public Nullable<System.DateTime> CreateDate { get; set; }  
       public Nullable<int> CreateUserId { get; set; }  
       public Nullable<bool> CreateUserIsAdmin { get; set; }  
       public Nullable<System.DateTime> UpdateDate { get; set; }  
       public Nullable<int> UpdateUserId { get; set; }  
       public Nullable<bool> UpdateUserIsAdmin { get; set; }  
     
       public virtual AspNetUsers AspNetUsers { get; set; }  
       [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]  
       public virtual ICollection<Responses> Responses1 { get; set; }  
       public virtual Responses Responses2 { get; set; }  
       public virtual Topics Topics { get; set; }  
   }  
```  
### 試したこと
(1)
Controllerを次のように書き換えたところ、次の画像のようにViewで表示されるDropDownListの中身がChar型になってしまいます。
 return contentを用いてidとnameを表示した時にはハッシュ値のパスとユーザー名が表示できたのでidとnameには問題がないのではと考えています
(idとnameにIdentityの情報を格納し、Viewbag.ResOwnerId の値をコメントアウトしている行からその次の行のように書き換えました)
```c#
       // GET: Responses/Create
       public ActionResult Create()
       {
           string id = User.Identity.GetUserId();
           string name = User.Identity.GetUserName();
           //ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "UserName");
           ViewBag.ResOwnerId = new SelectList(id);
           ViewBag.ResId = new SelectList(db.Responses, "Id", "Title");
           ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title");
           return View();
       }
```
![イメージ説明](fbb2f9bc571cad065158c136b3651273.png)  
表示されているchar型でのDropDownListの正体は、 ASP.NET Identityで用意したASPNetUsersテーブルのId値です  
![イメージ説明](a107a72b2f6d6053ec3f52c9a07c52e3.png)  
### 補足情報(FW/ツールのバージョンなど)
Windows7
VS2017
ASP.NET MVC5
Net Framework 4.6.1
  • C#

    16119 questions

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

  • ASP.NET

    991 questions

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

  • MVC

    439 questions

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

2 質問が長すぎたので短く修正

pomu.pomupomu

pomu.pomupomu score 18

2018/07/13 13:22  投稿

View画面のDropDownListの値の固定と先頭のブランクについて
ASP.NET mvc5 を用いて、掲示板を作成している初学者です。
質問に対する回答、いつもありがとうございます。
### 前提・実現したいこと
DBfirstでの"ADO.NET Entity Data Model"の作成機能を用いてModelを作成し、スキャフォールディング機能を用いてViewとControllerの自動生成をしました。
その後、ASP.NET identityを用いて実装したログイン機能を基に、トピックの中のレスの作成をしているのですが、行き詰まったので質問を投稿しました。
似たような投稿であると思い、3回に分けずに1回でまとめて投稿しましたが、どれかに回答をいただけるだけでもとてもありがたいです。長文ですがよろしくお願いします。  
### 発生している問題・エラーメッセージ
次の画像はトピックの中のレスを新規に作成するためのページなのですが、以下の3つの問題を抱えています。
 (1) Topic名について、現在のレスが所属するトピックの名前のみ表示したいのにデータベースに記録されているトピック全件をDropDownListで表示をしてしまう。
 (2) DropDownListの先頭にValue=""となる空白を用意したいが、レスのタイトルが全件表示されてしまう。
 (3)レスの記入者を現在ログインしているユーザー名で固定したいが、ユーザー名をすべて表示してしまう。また、世の中の目標制作物に類似するものはそもそも「記入者=ログインユーザー名」だというのが自明なので表示してないように思えるので表示しない方法もあればご教授いただけたら幸いです。
![イメージ説明](f08ad8c48bf0d5e34d24cc7bcba0a097.png)![イメージ説明](932997a513cf5db05149f14242f3230c.png)
次の画像はトピックの中のレスを新規に作成するためのページなのですが、以下の問題を抱えています。
 (1) レスの記入者を現在ログインしているユーザー名で固定したいが、ユーザー名をすべて表示してしまう。また、世の中の目標制作物に類似するものはそもそも「記入者=ログインユーザー名」だというのが自明なので表示してないように思えるので表示しない方法もあればご教授いただけたら幸いです。
![イメージ説明](f08ad8c48bf0d5e34d24cc7bcba0a097.png)!
### 該当のソースコード
Controller
```C#
       // GET: Responses/Create
       public ActionResult Create()
       {
           string id = User.Identity.GetUserId();
           string name = User.Identity.GetUserName();
           ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "UserName");
         
           ViewBag.ResId = new SelectList(db.Responses, "Id", "Title");
           ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title");
           return View();
           // return Content(id + name);
       }
       // POST: Responses/Create
       // 過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。
       // 詳細については、https://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。
       [HttpPost]
       [ValidateAntiForgeryToken]
       public ActionResult Create([Bind(Include = "Id,SortNo,TopicId,ResId,Title,Contents,ResOwnerId,ResponseCount,ViewCount,RecentResDate,CountNice,CountLaugh,CountTears,CountSurprise,CountAnger,HiddenFlag,DeleteFlag,DeleteUserId,DeleteUserIsAdmin,DeleteDate,CreateDate,CreateUserId,CreateUserIsAdmin,UpdateDate,UpdateUserId,UpdateUserIsAdmin")] Responses responses)
       {
           if (ModelState.IsValid)
           {
               db.Responses.Add(responses);
               db.SaveChanges();
               return RedirectToAction("Index");
           }
           ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "Email", responses.ResOwnerId);
           ViewBag.ResId = new SelectList(db.Responses, "Id", "Title", responses.ResId);
           ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title", responses.TopicId);
           return View(responses);
       }
```
View
``` C#
@model AlbatrossOnClouds.Models.Responses
@{
   ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
   @Html.AntiForgeryToken()
   
   <div class="form-horizontal">
       <h4>Responses</h4>
       <hr />
       @Html.ValidationSummary(true, "", new { @class = "text-danger" })
       <div class="form-group">
           @Html.LabelFor(model => model.TopicId, "トピック名", htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.DropDownList("TopicId", null, htmlAttributes: new { @class = "form-control" })
               @Html.ValidationMessageFor(model => model.TopicId, "", new { @class = "text-danger" })
           </div>
       </div>
       <div class="form-group">
           @Html.LabelFor(model => model.ResId, "重ねてレスするタイトル", htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.DropDownList("ResId", null, htmlAttributes: new { @class = "form-control" })
               @Html.ValidationMessageFor(model => model.ResId, "", new { @class = "text-danger" })
           </div>
       </div>
       <div class="form-group">
           @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
               @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
           </div>
       </div>
       <div class="form-group">
           @Html.LabelFor(model => model.Contents, htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.EditorFor(model => model.Contents, new { htmlAttributes = new { @class = "form-control" } })
               @Html.ValidationMessageFor(model => model.Contents, "", new { @class = "text-danger" })
           </div>
       </div>
       
       <div class="form-group">
           @Html.LabelFor(model => model.ResOwnerId, "レスの記入者", htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               
              @Html.DropDownList("ResOwnerId", null, htmlAttributes: new { @class = "form-control" })
              @Html.ValidationMessageFor(model => model.ResOwnerId, "", new { @class = "text-danger" })
               
           </div>
       </div>
       
       <div class="form-group">
           <div class="col-md-offset-2 col-md-10">
               <input type="submit" value="Create" class="btn btn-default" />
           </div>
       </div>
   </div>
}
<div>
   @Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
   @Scripts.Render("~/bundles/jqueryval")
}
```
Model
```c#
   public partial class Responses
   {
       [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
       public Responses()
       {
           this.Responses1 = new HashSet<Responses>();
       }
   
       public int Id { get; set; }
       public Nullable<int> SortNo { get; set; }     
       public Nullable<int> TopicId { get; set; }
       public Nullable<int> ResId { get; set; }
       [Display(Name = "タイトル")]
       public string Title { get; set; }
       [Display(Name = "レス内容")]
       public string Contents { get; set; }
       [Display(Name = "レスの書き込み者")]
       public string ResOwnerId { get; set; }
       public Nullable<int> ResponseCount { get; set; }
       public Nullable<int> ViewCount { get; set; }
       public Nullable<System.DateTime> RecentResDate { get; set; }
       public Nullable<int> CountNice { get; set; }
       public Nullable<int> CountLaugh { get; set; }
       public Nullable<int> CountTears { get; set; }
       public Nullable<int> CountSurprise { get; set; }
       public Nullable<int> CountAnger { get; set; }
       public Nullable<bool> HiddenFlag { get; set; }
       public Nullable<bool> DeleteFlag { get; set; }
       public Nullable<int> DeleteUserId { get; set; }
       public Nullable<bool> DeleteUserIsAdmin { get; set; }
       public Nullable<System.DateTime> DeleteDate { get; set; }
       public Nullable<System.DateTime> CreateDate { get; set; }
       public Nullable<int> CreateUserId { get; set; }
       public Nullable<bool> CreateUserIsAdmin { get; set; }
       public Nullable<System.DateTime> UpdateDate { get; set; }
       public Nullable<int> UpdateUserId { get; set; }
       public Nullable<bool> UpdateUserIsAdmin { get; set; }
   
       public virtual AspNetUsers AspNetUsers { get; set; }
       [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
       public virtual ICollection<Responses> Responses1 { get; set; }
       public virtual Responses Responses2 { get; set; }
       public virtual Topics Topics { get; set; }
   }
```
### 試したこと
 
(1)
スキャフォールディング機能で実装したIndexでは、現在、ControllerにIdを設定する事でどのトピックの中のレスを見るのか判断できるようにしました。  
http://localhost:51822/Topics/Index  
以下はトピック一覧からレスを覗くために記したコードです。  
 
``` C#  
@Html.ActionLink("Thread", "Index", new { controller = "Responses", id = item.Id })  
```  
上のコードの部分を実行しクリックする事で遷移後のページのURLは  
http://localhost:51822/Responses/Index/1  
となり、 urlの末尾に現在のレス一覧が所属するidがつくようになりました。  
しかし、レス一覧のページ(URLの末尾にidが含まれている)において、次のコードを実行してクリックしても  
  http://localhost:51822/Responses/Create  
という UrlになるためそもそもIdが引き継げないです。  
```c#  
<p>  
   @Html.ActionLink("Create New", "Create", new { id = UrlParameter.Optional })  
</p>  
```  
 
(2)  
調べたのですが、今回のようなModelからデータを引っ張る場合に空白値を加えるものについての記事は見つけられませんでした。  
 
(3)  
Controllerを次のように書き換えたところ、次の画像のようにViewで表示されるDropDownListの中身がChar型になってしまいます。
 return contentを用いてidとnameを表示した時にはハッシュ値のパスとユーザー名が表示できたのでidとnameには問題がないのではと考えています
(idとnameにIdentityの情報を格納し、Viewbag.ResOwnerId の値をコメントアウトしている行からその次の行のように書き換えました)
```c#
       // GET: Responses/Create
       public ActionResult Create()
       {
           string id = User.Identity.GetUserId();
           string name = User.Identity.GetUserName();
           //ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "UserName");
           ViewBag.ResOwnerId = new SelectList(id);
           ViewBag.ResId = new SelectList(db.Responses, "Id", "Title");
           ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title");
           return View();
       }
```
![イメージ説明](fbb2f9bc571cad065158c136b3651273.png)
表示されているchar型でのDropDownListの正体は、 ASP.NET Identityで用意したASPNetUsersテーブルのId値です
![イメージ説明](a107a72b2f6d6053ec3f52c9a07c52e3.png)
### 補足情報(FW/ツールのバージョンなど)
Windows7
VS2017
ASP.NET MVC5
Net Framework 4.6.1
  • C#

    16119 questions

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

  • ASP.NET

    991 questions

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

  • MVC

    439 questions

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

1 説明の追記

pomu.pomupomu

pomu.pomupomu score 18

2018/07/09 18:46  投稿

View画面のDropDownListの値の固定と先頭のブランクについて
ASP.NET mvc5 を用いて、掲示板を作成している初学者です。
質問に対する回答、いつもありがとうございます。
### 前提・実現したいこと
DBfirstでの"ADO.NET Entity Data Model"の作成機能を用いてModelを作成し、スキャフォールディング機能を用いてViewとControllerの自動生成をしました。
その後、ASP.NET identityを用いて実装したログイン機能を基に、トピックの中のレスの作成をしているのですが、行き詰まったので質問を投稿しました。
似たような投稿であると思い、3回に分けずに1回でまとめて投稿しましたが、どれかに回答をいただけるだけでもとてもありがたいです。長文ですがよろしくお願いします。  
### 発生している問題・エラーメッセージ
次の画像はトピックの中のレスを新規に作成するためのページなのですが、以下の3つの問題を抱えています。
 (1) Topic名について、現在のレスが所属するトピックの名前のみ表示したいのにデータベースに記録されているトピック全件をDropDownListで表示をしてしまう。
 (2) DropDownListの先頭にValue=""となる空白を用意したいが、レスのタイトルが全件表示されてしまう。
 (3)レスの記入者を現在ログインしているユーザー名で固定したいが、ユーザー名をすべて表示してしまう。また、世の中の目標制作物に類似するものはそもそも「記入者=ログインユーザー名」だというのが自明なので表示してないように思えるので表示しない方法もあればご教授いただけたら幸いです。
![イメージ説明](f08ad8c48bf0d5e34d24cc7bcba0a097.png)![イメージ説明](932997a513cf5db05149f14242f3230c.png)
### 該当のソースコード
Controller
```C#
       // GET: Responses/Create
       public ActionResult Create()
       {
           string id = User.Identity.GetUserId();
           string name = User.Identity.GetUserName();
           ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "UserName");
         
           ViewBag.ResId = new SelectList(db.Responses, "Id", "Title");
           ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title");
           return View();
           // return Content(id + name);
       }
       // POST: Responses/Create
       // 過多ポスティング攻撃を防止するには、バインド先とする特定のプロパティを有効にしてください。
       // 詳細については、https://go.microsoft.com/fwlink/?LinkId=317598 を参照してください。
       [HttpPost]
       [ValidateAntiForgeryToken]
       public ActionResult Create([Bind(Include = "Id,SortNo,TopicId,ResId,Title,Contents,ResOwnerId,ResponseCount,ViewCount,RecentResDate,CountNice,CountLaugh,CountTears,CountSurprise,CountAnger,HiddenFlag,DeleteFlag,DeleteUserId,DeleteUserIsAdmin,DeleteDate,CreateDate,CreateUserId,CreateUserIsAdmin,UpdateDate,UpdateUserId,UpdateUserIsAdmin")] Responses responses)
       {
           if (ModelState.IsValid)
           {
               db.Responses.Add(responses);
               db.SaveChanges();
               return RedirectToAction("Index");
           }
           ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "Email", responses.ResOwnerId);
           ViewBag.ResId = new SelectList(db.Responses, "Id", "Title", responses.ResId);
           ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title", responses.TopicId);
           return View(responses);
       }
```
View
``` C#
@model AlbatrossOnClouds.Models.Responses
@{
   ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm())
{
   @Html.AntiForgeryToken()
   
   <div class="form-horizontal">
       <h4>Responses</h4>
       <hr />
       @Html.ValidationSummary(true, "", new { @class = "text-danger" })
       <div class="form-group">
           @Html.LabelFor(model => model.TopicId, "トピック名", htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.DropDownList("TopicId", null, htmlAttributes: new { @class = "form-control" })
               @Html.ValidationMessageFor(model => model.TopicId, "", new { @class = "text-danger" })
           </div>
       </div>
       <div class="form-group">
           @Html.LabelFor(model => model.ResId, "重ねてレスするタイトル", htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.DropDownList("ResId", null, htmlAttributes: new { @class = "form-control" })
               @Html.ValidationMessageFor(model => model.ResId, "", new { @class = "text-danger" })
           </div>
       </div>
       <div class="form-group">
           @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
               @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
           </div>
       </div>
       <div class="form-group">
           @Html.LabelFor(model => model.Contents, htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               @Html.EditorFor(model => model.Contents, new { htmlAttributes = new { @class = "form-control" } })
               @Html.ValidationMessageFor(model => model.Contents, "", new { @class = "text-danger" })
           </div>
       </div>
       
       <div class="form-group">
           @Html.LabelFor(model => model.ResOwnerId, "レスの記入者", htmlAttributes: new { @class = "control-label col-md-2" })
           <div class="col-md-10">
               
              @Html.DropDownList("ResOwnerId", null, htmlAttributes: new { @class = "form-control" })
              @Html.ValidationMessageFor(model => model.ResOwnerId, "", new { @class = "text-danger" })
               
           </div>
       </div>
       
       <div class="form-group">
           <div class="col-md-offset-2 col-md-10">
               <input type="submit" value="Create" class="btn btn-default" />
           </div>
       </div>
   </div>
}
<div>
   @Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
   @Scripts.Render("~/bundles/jqueryval")
}
```
Model
```c#
   public partial class Responses
   {
       [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
       public Responses()
       {
           this.Responses1 = new HashSet<Responses>();
       }
   
       public int Id { get; set; }
       public Nullable<int> SortNo { get; set; }     
       public Nullable<int> TopicId { get; set; }
       public Nullable<int> ResId { get; set; }
       [Display(Name = "タイトル")]
       public string Title { get; set; }
       [Display(Name = "レス内容")]
       public string Contents { get; set; }
       [Display(Name = "レスの書き込み者")]
       public string ResOwnerId { get; set; }
       public Nullable<int> ResponseCount { get; set; }
       public Nullable<int> ViewCount { get; set; }
       public Nullable<System.DateTime> RecentResDate { get; set; }
       public Nullable<int> CountNice { get; set; }
       public Nullable<int> CountLaugh { get; set; }
       public Nullable<int> CountTears { get; set; }
       public Nullable<int> CountSurprise { get; set; }
       public Nullable<int> CountAnger { get; set; }
       public Nullable<bool> HiddenFlag { get; set; }
       public Nullable<bool> DeleteFlag { get; set; }
       public Nullable<int> DeleteUserId { get; set; }
       public Nullable<bool> DeleteUserIsAdmin { get; set; }
       public Nullable<System.DateTime> DeleteDate { get; set; }
       public Nullable<System.DateTime> CreateDate { get; set; }
       public Nullable<int> CreateUserId { get; set; }
       public Nullable<bool> CreateUserIsAdmin { get; set; }
       public Nullable<System.DateTime> UpdateDate { get; set; }
       public Nullable<int> UpdateUserId { get; set; }
       public Nullable<bool> UpdateUserIsAdmin { get; set; }
   
       public virtual AspNetUsers AspNetUsers { get; set; }
       [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
       public virtual ICollection<Responses> Responses1 { get; set; }
       public virtual Responses Responses2 { get; set; }
       public virtual Topics Topics { get; set; }
   }
```
### 試したこと
(1)
スキャフォールディング機能で実装したIndexでは、現在、ControllerにIdを設定する事でどのトピックの中のレスを見るのか判断できるようにしました。
http://localhost:51822/Topics/Index
以下はトピック一覧からレスを覗くために記したコードです。
``` C#
@Html.ActionLink("Thread", "Index", new { controller = "Responses", id = item.Id })
```
上のコードの部分を実行しクリックする事で遷移後のページのURLは
http://localhost:51822/Responses/Index/1
となり、 urlの末尾に現在のレス一覧が所属するidがつくようになりました。
しかし、レス一覧のページ(URLの末尾にidが含まれている)において、次のコードを実行してクリックしても
  http://localhost:51822/Responses/Create
という UrlになるためそもそもIdが引き継げないです。
```c#
<p>
   @Html.ActionLink("Create New", "Create", new { id = UrlParameter.Optional })
</p>
```
(2)
調べたのですが、今回のようなModelからデータを引っ張る場合に空白値を加えるものについての記事は見つけられませんでした。
(3)
Controllerを次のように書き換えたところ、次の画像のようにViewで表示されるDropDownListの中身がChar型になってしまいます。
(Viewbag.ResOwnerId の値をコメントアウトしている行からその次の行のように書き換えました)
 return contentを用いてidとnameを表示した時にはハッシュ値のパスとユーザー名が表示できたのでidとnameには問題がないのではと考えています
(idとnameにIdentityの情報を格納し、Viewbag.ResOwnerId の値をコメントアウトしている行からその次の行のように書き換えました)
```c#
       // GET: Responses/Create
       public ActionResult Create()
       {
           string id = User.Identity.GetUserId();
           string name = User.Identity.GetUserName();
           //ViewBag.ResOwnerId = new SelectList(db.AspNetUsers, "Id", "UserName");
           ViewBag.ResOwnerId = new SelectList(id);
           ViewBag.ResId = new SelectList(db.Responses, "Id", "Title");
           ViewBag.TopicId = new SelectList(db.Topics, "Id", "Title");
           return View();
       }
```
![イメージ説明](fbb2f9bc571cad065158c136b3651273.png)
表示されているchar型でのDropDownListの正体は、 ASP.NET Identityで用意したASPNetUsersテーブルのId値です
![イメージ説明](a107a72b2f6d6053ec3f52c9a07c52e3.png)
### 補足情報(FW/ツールのバージョンなど)
Windows7
VS2017
ASP.NET MVC5
Net Framework 4.6.1
  • C#

    16119 questions

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

  • ASP.NET

    991 questions

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

  • MVC

    439 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る