質問編集履歴

2 コード修正分の追加

masterofpuppets

masterofpuppets score 3

2018/10/12 11:31  投稿

ASP.NET MVC ラジオボタンのView/Controllerのやり取り
お世話になっております。
前回、[ASP.NET MVCでのラジオボタンについて](https://teratail.com/questions/151298)で質問させていただいた件で、
引き続き質問させていただきます。
開発環境:C#, ASP.NET MVC5, SQLServer2014
実現したいこと:社員各個人に複数のアンケートを取るが、各設問の回答を5段階(5:非常に満足、4:満足、3:普通~)で回答してもらう。
UIとして、ラジオボタンで選択させたい。
(複数と書きましたのは、例えばあるアンケートでは設問が10、別のアンケートでは設問が5…と、アンケート内容によって可変となる為)
SQLServer上に用意したテーブルですが、
「QAHead」テーブル
・QA_Id int …アンケートID
・Employee_Id int …社員番号
・Remarks nvarchar(max) …その他備考(フリーワード)
「QADetail」テーブル
・QA_Id int …アンケートID
・Employee_Id int …社員番号
・QA_No smallint …アンケートNo
・QA_Ans smallint …回答
となっております。QAHeadとQADetailは1:nの関係です。
対応するModelとしまして、
```
public class QAModels
{
   [DisplayName("ID")]
   public int QA_Id { get; set; }
   [DisplayName("社員番号")]
   public int Employee_Id { get; set; }
   [DisplayName("備考")]
   public string Remarks { get; set; }
   public IList<QADetailModels> Details { get; set; }
}
public class QADetailModels
{
   [DisplayName("ID")]
   public int QA_Id { get; set; }
   [DisplayName("社員番号")]
   public int Employee_Id { get; set; }
   [DisplayName("アンケートNo")]
   public short QA_No { get; set; }
// このアンケート内容は別のテーブルから引いてくるものとする
   [DisplayName("アンケート内容")]
   public string QA_Description { get; set; }
   [DisplayName("回答")]
   public short QA_Ans { get; set; }
}
```
としました。
View上で表示するために、
```
@model TESTAPP.Models.QAModels
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
<table class="table table-bordered">
   <tr><th>No</th><th>設問内容</th><th>回答</th></tr>
       foreach (var item in Model.Details)
       {
           <tr>
               <td>@item.QA_No</td>
               <td>@item.QA_Description</td>
               <td><div class="editor-field">
                   @for (int x = 1; x <= 5; x++)
                   {
                       <label>
                           @Html.RadioButtonFor(
                               m => item.QA_Ans,
                               x,
                               new { @Name = $"{item.Skill_No}", @id = $"{item.QA_No}_{x}"}
                           )
                           @x
                       </label>
                   }</div>
               </td>
           </tr>
   }
</table>
</div>
<div class="form-group">
   <div class="col-md-offset-2 col-md-10">
       <button name="button" value="Upd" class="btn btn-primary">更新</button>
   </div>
</div>
</div>
}
```
…これですと、View上への表示は可能ですが、ユーザーが(ラジオボタンをクリックして)選択した値をControllerに返す際、
```
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateEval([Bind(Include = "QA_Id, Employee_Id, Remarks, Details")] QAModels qam)
{
}
```
上記の記述ではDetailsがnullとなってしまい、データベースへの更新が出来ない状況です。
単に表示だけでなく、その後のユーザーの回答内容をデータベースに反映させるには、どのようにすればよいか、
アドバイス等何卒よろしくお願いいたします。
アドバイス等何卒よろしくお願いいたします。
【追記】
上記Viewの部分、以下のように変更してみました。
```
       foreach (int i = 0; i < Model.Details.Count; i++)
       {
           <tr>
               <td>@Html.DisplayFor(m => m.Details[i].QA_No)</td>
               <td>@Html.DisplayFor(m => m.Details[i].QA_Description)</td>
               <td><div class="editor-field">
                   @for (int x = 1; x <= 5; x++)
                   {
                       <label>
                           @Html.RadioButtonFor(
                               m => m.Details[i].QA_Ans,
                               x,
                               new { @Name = $"{Model.Details[i].QA_Ans}", @id = $"{Model.Details[i].QA_No}_{x}"}
                           )
                           @x
                       </label>
                   }</div>
               </td>
           </tr>
   }
```
データ表示に関しては表示はされますが、POSTした場合、相変わらずnullのままです。
  • C#

    9051 questions

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

  • ASP.NET

    625 questions

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

  • ASP.NET MVC Framework

    101 questions

    ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

1 URL追記

masterofpuppets

masterofpuppets score 3

2018/10/12 10:14  投稿

ASP.NET MVC ラジオボタンのView/Controllerのやり取り
お世話になっております。  
前回、[ASP.NET MVCでのラジオボタンについて](https://teratail.com/questions/151298)で質問させていただいた件で、  
引き続き質問させていただきます。  
 
開発環境:C#, ASP.NET MVC5, SQLServer2014
実現したいこと:社員各個人に複数のアンケートを取るが、各設問の回答を5段階(5:非常に満足、4:満足、3:普通~)で回答してもらう。
UIとして、ラジオボタンで選択させたい。
(複数と書きましたのは、例えばあるアンケートでは設問が10、別のアンケートでは設問が5…と、アンケート内容によって可変となる為)
SQLServer上に用意したテーブルですが、
「QAHead」テーブル
・QA_Id int …アンケートID
・Employee_Id int …社員番号
・Remarks nvarchar(max) …その他備考(フリーワード)
「QADetail」テーブル
・QA_Id int …アンケートID
・Employee_Id int …社員番号
・QA_No smallint …アンケートNo
・QA_Ans smallint …回答
となっております。QAHeadとQADetailは1:nの関係です。
対応するModelとしまして、
```
public class QAModels
{
   [DisplayName("ID")]
   public int QA_Id { get; set; }
   [DisplayName("社員番号")]
   public int Employee_Id { get; set; }
   [DisplayName("備考")]
   public string Remarks { get; set; }
   public IList<QADetailModels> Details { get; set; }
}
public class QADetailModels
{
   [DisplayName("ID")]
   public int QA_Id { get; set; }
   [DisplayName("社員番号")]
   public int Employee_Id { get; set; }
   [DisplayName("アンケートNo")]
   public short QA_No { get; set; }
// このアンケート内容は別のテーブルから引いてくるものとする
   [DisplayName("アンケート内容")]
   public string QA_Description { get; set; }
   [DisplayName("回答")]
   public short QA_Ans { get; set; }
}
```
としました。
View上で表示するために、
```
@model TESTAPP.Models.QAModels
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
<table class="table table-bordered">
   <tr><th>No</th><th>設問内容</th><th>回答</th></tr>
       foreach (var item in Model.Details)
       {
           <tr>
               <td>@item.QA_No</td>
               <td>@item.QA_Description</td>
               <td><div class="editor-field">
                   @for (int x = 1; x <= 5; x++)
                   {
                       <label>
                           @Html.RadioButtonFor(
                               m => item.QA_Ans,
                               x,
                               new { @Name = $"{item.Skill_No}", @id = $"{item.QA_No}_{x}"}
                           )
                           @x
                       </label>
                   }</div>
               </td>
           </tr>
   }
</table>
</div>
<div class="form-group">
   <div class="col-md-offset-2 col-md-10">
       <button name="button" value="Upd" class="btn btn-primary">更新</button>
   </div>
</div>
</div>
}
```
…これですと、View上への表示は可能ですが、ユーザーが(ラジオボタンをクリックして)選択した値をControllerに返す際、
```
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CreateEval([Bind(Include = "QA_Id, Employee_Id, Remarks, Details")] QAModels qam)
{
}
```
上記の記述ではDetailsがnullとなってしまい、データベースへの更新が出来ない状況です。
単に表示だけでなく、その後のユーザーの回答内容をデータベースに反映させるには、どのようにすればよいか、
アドバイス等何卒よろしくお願いいたします。
  • C#

    9051 questions

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

  • ASP.NET

    625 questions

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

  • ASP.NET MVC Framework

    101 questions

    ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

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