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

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

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

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

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

752閲覧

RazorPagesを用いた「JavaScript内の配列変数をC#コード内での参照する方法」についての質問

lemonesour

総合スコア25

C#

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

Razor

RazorはASP.NET Web PagesとASP.NET MVCで使われているビュー・エンジンです。HTMLマークアップとC#またはVisual Basicのコードに対応しています。マークアップとコードの間の切り替えは"@"で記されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2024/01/23 03:09

実現したいこと

JavaScriptコード内の配列変数「jscheckedColumns」を同一のcshtml内のC#コード(@コード内)で参照し、チェックボックスにチェックされている項目を以下の様に表のカラム項目に表示したい。

HTML

1 <th scope="col" style="background-color: azure; min-width:180px;">選択された項目1</th> 2 <th scope="col" style="background-color: azure; min-width:180px;">選択された項目2</th> 3 <th scope="col" style="background-color: azure; min-width:180px;">選択された項目3</th>
選択された項目1選択された項目2選択された項目3

発生している問題・分からないこと

RazorPagesを使用したWebページの実装方法において、cshtmlファイル内に以下のコード内の配列変数「jscheckedColumns 」を同一cshtmlファイル内のC#コード(@内コード)で参照することができません。

該当のソースコード

JavaScript

1<script> 2const checkboxes = document.querySelectorAll('input[type="checkbox"]'); 3let checkedCount = 0; // チェックカウンタ 4const jscheckedColumns = @Html.Raw(Json.Serialize(Model.checkedColumnList)); // チェック済みカラム名格納リスト 5 6checkboxes.forEach((checkbox, index) => { 7 const labelName = checkbox.parentNode.textContent.trim(); // チェックボックスの親要素からラベル名を取得 8 9 checkbox.value = labelName; // チェックボックスのvalue属性にラベル名を設定 10 11 if (checkbox.checked) { 12 checkedCount++; 13 jscheckedColumns.push(labelName); // デフォルトでチェックされている場合、選択された項目を追加 14 } 15 16 checkbox.addEventListener('change', function () { 17 if (this.name == 'customCheckBox') { 18 if (this.checked) { 19 checkedCount++; 20 if (checkedCount >= 6) { 21 this.checked = false; 22 checkedCount--; 23 alert('最大選択数は5つです。'); 24 } else { 25 jscheckedColumns.push(labelName); // チェックされたら選択された項目を配列に追加 26 } 27 } else { 28 checkedCount--; 29 if (checkedCount <= 0) { 30 this.checked = true; 31 checkedCount++; 32 alert('1つ以上選択する必要があります。'); 33 } else { 34 const indexToRemove = jscheckedColumns.indexOf(labelName); 35 jscheckedColumns.splice(indexToRemove, 1); // チェックが外れたら選択された項目を配列から削除 36 } 37 } 38 } 39 console.log("選択された項目: ", jscheckedColumns); 40 }); 41}); 42</script>

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

試した方法1:
CSファイル内にBindingPropertyの変数を定義し、Modelを用いた変数(Razor変数)の共有方法を試みました。

C#

1[BindProperty] 2public List<string> CheckedColumns { get; set; } = new List<string>();

CSHTMLファイル内

1<script> 2 const jscheckedColumns = @Html.Raw(Json.Serialize(Model.CheckedColumns)); 3 // 処理は省略 4</script> 5 6@if (Model.CheckedColumns.Contains("項目A")) 7{ 8 // 項目Aを表のカラムに追加して表示する処理 9}

結果:
Model.CheckedColumnsを参照しても中身がcount=0、capacity=0となっており、チェックボックスでチェックされている項目を参照できません。
ただし、JavaScriptコードにおいて、jscheckedColumns内にはチェックされた項目が正しく格納されています。

試した方法2:
Model.CheckedColumnsに追加する必要があるかと思い、JavaScript内に以下のコードを追加しました。

JavaScript

1 // jscheckedColumnsをModel.JsCheckedColumnsに設定 2 jscheckedColumns.forEach(function (column) { 3 @Model.JsCheckedColumns.Add(column); 4 });

結果:
「現在のコンテキストに'column'という名前は存在しません」とエラーが出てしまいます。

補足

特になし

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

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

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

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

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

guest

回答3

0

RazorPagesではJavaScriptコード内の変数をC#コードで参照するには、サーバへPOST送信やAjax送信する必要があり、クライアントのブラウザでC#コードは動きません。クライアントのブラウザでC#コードがそのまま動くような記述をしたいのであれば、RazorPagesではなくBlazor Serverを検討して下さい。

この時点ですでに質問者さんの意図とは違う回答になるかもわりませんが、

「JavaScript内の配列変数をC#コード内での参照する方法」

ということへの一般的な回答としては以下の通りです。

JavaScript変数であるjscheckedColumnsを
JSON.stringify(jscheckedColumns) と文字列にし、
サーバへPOST送信かAjax送信し、サーバ側のC#コードで
CheckedColumns = JsonSerializer.Deserialize<List<string>>(PostValue);
とすればJavaScript内の配列変数をC#変数に戻せます。

※PostValueはPOST送信かAjax送信した文字列です。

投稿2024/01/25 02:57

naitou

総合スコア141

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

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

0

サーバーサイドで、C#が実行されてその結果作成されたHTMLがクライアントのブラウザに送られて、その中のJavaScript部分がブラウザ内で実行されます。
JavaScriptの実行結果を、サーバーサイドでそのHTMLを作成した時点のC#に伝えるためには時間を遡って過去に通信する仕組みが必要です(タイムマシン)。
チェックボックスのチェック内容によって、HTMLを変更したいなら、その変更はJavaScriptでそのまま行います。

投稿2024/01/23 03:30

otn

総合スコア85785

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

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

0

自己解決

HTMLにinput typeをhiddenにし、id=任意のIDとasp-for=Modelプロパティを指定し、JavaScriptでgetElemntByIdで書き込み、C#側でModelプロパティを参照すれば、JavaScript(クライアントサイド)とC#(サーバサイド)でのデータの共有ができました。

投稿2024/02/02 04:44

lemonesour

総合スコア25

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問