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

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

ただいまの
回答率

90.54%

  • C#

    7073questions

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

  • ASP.NET

    526questions

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

  • ASP.NET MVC Framework

    59questions

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

ASP.NET MVCでのラジオボタンについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 109

社員一人一人にアンケートを取る仕組みをASP.NET MVC 5(言語はC#),SQLServer2014で開発中です。
10問の設問につき、5段階(5:非常に満足、4:満足、3:普通~)で回答してもらいます。
この回答部分を単に5,或いは1のように数値をテキストボックスに入力するのではなく、ラジオボタンで選択させたいと考えます。

年度(smallint)・社員番号(int)・設問No(smallint)・設問文(nvarchar(max))・回答(smallint)という列から成る設問回答テーブルに、
データを格納します。1社員につき10の設問ですので10レコード出来るイメージです。

Modelとしまして下記QAModelsを用意しました。

public class QAModels
{
    [DisplayName("年度")]
    public short Year { get; set; }

    [DisplayName("社員番号")]
    public int EmpId { get; set; }

    [DisplayName("設問No")]
    public short QNo { get; set; }

    [DisplayName("設問文")]
    public string QDesc { get; set; }

    [DisplayName("回答")]
    public short Ans { get; set; }
}


そして以下のようにViewを記述してみたのですが、肝心のラジオボタンが各行で選択出来ません。
(1行目で選択したとしても、2行目を選択すると消えてしまう)

        <table class="table table-bordered">
            <tr><th>No</th><th>設問</th><th>回答</th></tr>
                foreach (var item in Model)
                {
                    <tr>
                        <td>@item.QNo</td>
                        <td>@item.QDesc</td>
                        <td>
                            <label>
                                @Html.RadioButtonFor(
                                    m => item.Ans,
                                    1,
                                    new { @id = "QA" + @item.QNo }
                                )
                                1
                            </label>
                            <label>
                                @Html.RadioButtonFor(
                                    m => item.Ans,
                                    2,
                                    new { @id = "QA" + @item.QNo }
                                )
                                2
                            </label>
                            <label>
                                @Html.RadioButtonFor(
                                    m => item.Ans,
                                    3,
                                    new { @id = "QA" + @item.QNo }
                                )
                                3
                            </label>
                            <label>
                                @Html.RadioButtonFor(
                                    m => item.Ans,
                                    4,
                                    new { @id = "QA" + @item.QNo }
                                )
                                4
                            </label>
                            <label>
                                @Html.RadioButtonFor(
                                    m => item.Ans,
                                    5,
                                    new { @id = "QA" + @item.QNo }
                                )
                                5
                            </label>
                        </td>
                    </tr>
                }
        </table>


各行でラジオボタンにて回答させるには、どのようにすれば良いか、
ヒント・アドバイスの程何卒よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2018/10/11 10:56

    MVC5 とのことですのでタグの ASP.NET MVC 4 は不適切です。ASP.NET, ASP.NET MVC Framework というタグがありますのでそちらを付けていただくようお願いします。

    キャンセル

  • masterofpuppets

    2018/10/11 11:22

    大変失礼いたしました。修正いたしましたので、何卒よろしくお願いいたします。

    キャンセル

  • SurferOnWww

    2018/10/11 11:32

    > 1行目で選択したとしても、2行目を選択すると消えてしまう ← そこは RadioButtonFor が input type="radio" という html 要素にレンダリングされる際の name 属性の設定で解決できますが、それだけではダメで、ボタンクリックなどで結果をサーバー側で取得できる必要もあるのですよね?

    キャンセル

  • SurferOnWww

    2018/10/11 12:41

    もう一つ、「10問の設問」ということは 10 個の QAModels コレクションがアクションメソッドでモデルバインドされるようにする必要があると思いますが、そこのところはどう考えていますか? その必要があるということですともう一工夫必要ですが? 参考: http://surferonwww.info/BlogEngine/post/2014/09/01/validation-of-collection-data-during-model-binding-using-data-annotation.aspx

    キャンセル

回答 1

checkベストアンサー

0

生成されたHTMLを確認すればわかると思いますが、name属性が全て「item.Ans」だからです。
行毎にname属性を変える必要があります。
あとついでにid属性が行毎に同じですが、ページ内で一意である必要があります。

htmlAttributesのパラメータを下記のようにしたらできると思います。

new { @Name = $"QA{item.QNo}", @id = $"QA{item.QNo}_[選択肢のvalue]"}

補足で

@for (int i = 1; i <= 5; i++)
{
    <label>
        @Html.RadioButtonFor(
            m => item.Ans,
            i,
            new { @Name = $"QA{item.QNo}", @id = $"QA{item.QNo}_{i}"}
        )
        @i
    </label>
}


としたら記述量が減ります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/11 11:45

    workaholist様
    早速のご回答、誠にありがとうございました。
    ご教示いただいた内容で、解決することが出来ました。
    御礼申し上げます。

    キャンセル

  • 2018/10/11 13:45

    ユーザーの入力結果を POST して、アクションメソッドで結果を取得するところまで解決できたのですか?

    キャンセル

  • 2018/10/11 14:57

    SurferOnWww様

    お世話になります。
    いえ、実はまだその部分は未着手でございます。
    ご指摘のように10個分のQAモデルが必要になるとなると…そもそもの設計が破綻しておりますでしょうか・・・
    お恥ずかしい限りです。

    キャンセル

  • 2018/10/11 15:53

    上の質問に対する私の 2018/10/11 12:41 コメントを見て下さい。10 個の QAModels のコレクションのモデルバインディングがうまく行われるようにするには、レンダリングされる html 要素の name 属性が連番のインデックスを含むようにする必要があります。そこまで考えないとこの先で破綻するのではないかと思います。

    キャンセル

  • 2018/10/11 16:10

    POST値を取得するだけならアクションメソッドの引数をモデルではなくFormCollectionにしたり、Request.Formから取得できます。
    キレイにやりたいのであればモデルを列挙で持つのではなく、モデル1つのなかにAns1、Ans2...みたいな感じでプロパティを持てば良いと思います。

    キャンセル

  • 2018/10/11 16:13 編集

    質問者さん>
    私のコメントの話が分からなければ、新たに別のスレッドを立てて質問してください。

    キャンセル

  • 2018/10/11 16:25

    workaholist さん>

    質問者さんの要件を満たすためには、10 個の QAModels のコレクションのモデルバインディングができる必要がある、即ち public ActionResult ActionMethod(List<QAModels> model) の引数で取得できる必要があると思います。

    「FormCollectionにしたり、Request.Formから取得」とか「モデル1つのなかにAns1、Ans2...みたいな感じ」では、不可能ではないかもしれませんが、かなり無理があると思います。少なくともスマートなやり方ではありません。

    キャンセル

  • 2018/10/11 19:36

    SurferOnWwwさん

    質問者さんの要件は「ラジオボタンを各行で選択できるようにする」なのでそれ以上のことは考えていません。
    それ以上の要件(設問数は可変or固定、アノテーション検証有無、データ取得・登録方法など)は不明なので、疑問になればまた質問が出ると考えています。
    ある程度、要件を予測されるのであれば、前提条件を記述した上でこういう風に実装したら良いと回答されたら良いと思われます。

    キャンセル

  • 2018/10/11 19:56

    > 質問者さんの要件は「ラジオボタンを各行で選択できるようにする」なのでそれ以上のことは考えていません。

    いえ、それは違うと思いますよ。最終的に何をしたいのかを考えて回答しないと、場合によっては、迷走するばかりで解決から遠ざかるばかりと思ってます。私のコメントを「要件を予測」とのことですが、そんなことはなくて「1社員につき10の設問ですので10レコード出来る」という要件は質問に書いてあります。

    > こういう風に実装したら良いと回答されたら良いと思われます。

    上に書きましたが、質問者さんが新たに別のスレッドを立てて質問したら対応します。

    キャンセル

  • 2018/10/11 20:03

    「1社員につき10の設問ですので10レコード出来る」のであれば「モデル1つのなかにAns1、Ans2...みたいな感じ」でできませんか?
    QNo1, Ans1, QNo2, Ans2 ... QNo10, Ans10 というプロパティ持つモデルを1つ作れば public ActionResult ActionMethod(QAModels model) とできると思いますが。

    キャンセル

  • 2018/10/11 20:16

    もっとスマートにできる方法があります。そのあたりは質問者さんが新たに別のスレッドを立てて質問したら書きます。ここで書いても誰も見てなさそうで、書く気力が出てきませんので。スミマセン

    キャンセル

  • 2018/10/11 20:20 編集

    それならなぜわざわざ私の回答にコメントを付けたのですか?
    ベストアンサーって付けてるけどベストじゃないよ!そのベストを知ってるけど言わないけどね。と言いたかっただけですか?

    キャンセル

  • 2018/10/11 20:26

    SurferOnWww様
    workaholist様

    お世話になっております。
    本件では私の至らないせいでご迷惑をお掛けし申し訳ございません。
    おっしゃる通り、POSTで返す部分で迷走しております。
    明日改めて別の質問として上げさせていただきます。
    何卒よろしくお願いいたします。

    キャンセル

  • 2018/10/11 20:57

    > それならなぜわざわざ私の回答にコメントを付けたのですか?

    はっきり言わせてもらえれば、その場しのぎの回答というだけで、真の解決にはなってないからです。ここは質問者さん専用の Q&A スレッドではなく、情報共有の場と思ってます。一般閲覧者が見たとき、私が関わったスレッドで一般閲覧者がミスリードされる可能性のあることには黙ってられません。

    キャンセル

  • 2018/10/12 10:44

    この回答欄で真の解決をしたいということですので、この回答欄で真の解決をよろしくお願いします。
    「別のスレッドで or 気力がわかないなら」はこの回答欄で立派な意見を言われているので言い訳になりません。
    以降、私はコメントしません。

    キャンセル

  • 2018/10/12 11:50

    質問者さんが新しく別のスレッド ↓ を立てたのでそちらで回答します。
    https://teratail.com/questions/151505

    キャンセル

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

  • ただいまの回答率 90.54%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7073questions

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

  • ASP.NET

    526questions

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

  • ASP.NET MVC Framework

    59questions

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