- 投稿日:2021-03-08T22:46:05+09:00
ASP.Net Core(ver 2.1)でフォーム画面からのリクエストパラメータをPost通信する(第1回)
【実行環境】
PC:Windows10
開発環境:Visual Studio2019 Community
C#フレームワーク:ASP.Net Core (version 2.1)ASP.Net Core(version 2.1)でのHTMLフォーム画面から登録内容を入力してPost通信してサーバ側に送る、という一連のサンプルコードがなかなか見当たらないので作ってみた。
この記事はシリーズ化する予定。
第1回はHTMLの「form」タグを使わずにPost通信する方法を考えてみた。
入力画面と確認画面は以下の通り。プロジェクトのディレクトリ構造は以下の通り。
【ディレクトリ構造】Project ├ wwwroot │ ├ js │ │ └ TorokuForm.js │ ├ │ ├ css │ ├ │ ├ lib │ │ ├ bootstrap │ │ │ └ js │ │ │ └ bootstrap.min.js │ │ ├ jquery │ │ │ └ jquery.min.js │ │ └ │ ├ pages │ │ ├ TorokuForm.html │ │ └ TorokuFormConfirm.html │ └ ├ Controllers │ └ TorokuFormController.cs ├ └ Dto └ TorokuFormEntity.csTorokuForm.html<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>登録フォーム</title> <!--共通ライブラリ--> <link rel="stylesheet" href="" /> <script type="text/javascript" src="../lib/bootstrap/js/bootstrap.min.js"></script> <script type="text/javascript" src="../lib/jquery/jquery.min.js"></script> <!--個別ファイル--> <script type="text/javascript" src="../js/TorokuForm.js"></script> </head> <body> <!--名前(姓)--> <div class="nameSeiArea"> <div class="nameSeiLabelTitle"> 名前(姓)<br />First Name </div> <div class="nameSeiInputTitle"> <input type="text" class="nameSeiInputClass" name="nameSei" id="nameSeiInputId" data-toggle="tooltip" title="名前(姓)を入力してください" required /> </div> </div> <!--名前(名)--> <div class="nameMeiArea"> <div class="nameMeiLabelTitle"> 名前(名)<br />Last Name </div> <div class="nameMeiInputTitle"> <input type="text" class="nameMeiInputClass" name="nameMei" id="nameMeiInputId" data-toggle="tooltip" title="名前(名)を入力してください" required /> </div> </div> <!--半角フリガナ(姓)--> <div class="hankakuHuriganaSeiArea"> <div class="hankakuHuriganaSeiLabelTitle"> 半角フリガナ(姓)<br />Half-Width Kana(First Name) </div> <div class="hankakuHuriganaSeiInputTitle"> <input type="text" class="hankakuHuriganaSeiInputClass" name="hankakuHuriganaSei" id="hankakuHuriganaSeiInputId" data-toggle="tooltip" title="半角フリガナ(姓)を入力してください" required /> </div> </div> <!--半角フリガナ(名)--> <div class="hankakuHuriganaMeiArea"> <div class="hankakuHuriganaMeiLabelTitle"> 半角フリガナ(名)<br />Half-Width Kana(Last Name) </div> <div class="hankakuHuriganaMeiInputTitle"> <input type="text" class="hankakuHuriganaMeiInputClass" name="hankakuHuriganaMei" id="hankakuHuriganaMeiInputId" data-toggle="tooltip" title="半角フリガナ(姓)を入力してください" required /> </div> </div> <!--性別--> <div class="sexArea"> <div class="sexLabelTitle"> 性別<br />Sex </div> <div class="sexInputTitle"> <label class="radioBtnClass" id="radioBtnClassId"> <input type="radio" name="sex" class="sexClass" value="男性" id="sexMen" checked />男性 Men <input type="radio" name="sex" class="sexClass" value="女性" id="sexWomen" />女性 Women </label> </div> </div> <!--会社名または学校名--> <div class="comnanySchoolNameArea"> <div class="comnanySchoolNameLabelTitle"> 会社名または学校名<br />Your Company or school Name </div> <div class="comnanySchoolNameInputTitle"> <input type="text" class="comnanySchoolNameInputClass" name="comnanySchoolName" id="comnanySchoolNameInputId" data-toggle="tooltip" title="会社名または学校名を入力してください" required /> </div> </div> <!--所属先名--> <div class="departmentNameArea"> <div class="departmentNameLabelTitle"> 所属先名<br />Your Department Name </div> <div class="departmentNameInputTitle"> <input type="text" class="departmentNameInputClass" name="departmentName" id="departmentNameInputId" data-toggle="tooltip" title="所属先名を入力してください" required /> </div> </div> <!--メールアドレス--> <div class="emailAddressArea"> <div class="emailAddressLabelTitle"> メールアドレス<br />E-mail Address </div> <div class="emailAddressInputTitle"> <input type="text" class="emailAddressInputClass" name="emailAddress" id="emailAddressInputId" data-toggle="tooltip" title="メールアドレスを入力してください" required /> </div> </div> <!--郵便番号--> <div class="addressArea"> <div class="addressLabelTitle"> 郵便番号<br />Post Address </div> <div class="addressInputTitle"> <input type="text" class="addressInputClass" name="address" id="addressInputId" data-toggle="tooltip" title="郵便番号を入力してください" required /> </div> <div class="addressBtnArea"> <button class="btn btn-primary" id="addressBtnId">自動検索</button> </div> </div> <!--都道府県名--> <div class="prefectureArea"> <div class="prefectureLabelTitle"> 都道府県名<br />Prefecture </div> <div class="prefectureInputTitle"> <input type="text" class="prefectureInputClass" name="prefecture" id="prefectureInputId" /> </div> </div> <!--市区町村名--> <div class="cityNameArea"> <div class="cityNameLabelTitle"> 市区町村名<br />City Name </div> <div class="cityNameInputTitle"> <input type="text" class="cityNameInputClass" name="cityName" id="cityNameInputId" /> </div> </div> <!--町名・番地名--> <div class="chomeBanchiNameArea"> <div class="chomeBanchiNameLabelTitle"> 町名・番地名<br />Chome Banchi Name </div> <div class="chomeBanchiNameInputTitle"> <input type="text" class="chomeBanchiNameInputClass" name="chomeBanchiName" id="chomeBanchiNameInputId" /> </div> </div> <!--電話番号--> <div class="phoneArea"> <div class="phoneLabelTitle"> 電話番号<br />Phone </div> <div class="phoneInputTitle"> <input type="text" class="phoneInputClass" name="phone" id="phoneInputId" data-toggle="tooltip" title="電話番号を入力してください" required /> </div> </div> <!--FAX--> <div class="faxArea"> <div class="faxLabelTitle"> Fax番号<br />Fax </div> <div class="faxInputTitle"> <input type="text" class="faxInputClass" name="fax" id="faxInputId" /> </div> </div> <!--パスワード--> <div class="passwordArea"> <div class="passwordLabelTitle"> パスワード<br />Password </div> <div class="passwordInputTitle"> <input type="password" class="passwordOneceInputClass" name="password" id="passwordOneceInputId" data-toggle="tooltip" title="パスワードを入力してください" required /> <input type="password" class="passwordTwiceInputClass" name="password" id="passwordTwiceInputId" data-toggle="tooltip" title="パスワードをもう一度入力してください" required /> </div> </div> <!--メルマガ購読--> <div class="mailMagagineArea"> <div class="mailMagagineLabelTitle"> メルマガ購読する<br />Mail Magagine Subscribe </div> <div class="mailMagagineInputTitle"> <label class="mailMagagineLabel"> <input type="checkbox" class="mailMagagineInputClass" name="mailMagagine" id="mailMagagineInputId" />購読する </label> </div> </div> <div class="contentsCheckBtnArea"> <button class="btn contentsCheckBtnClass" id="contentsCheckBtnId">内容確認</button> </div> </body> </html>TorokuFormConfirm.html<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>登録フォーム(確認画面)</title> <!--共通ライブラリ--> <link rel="stylesheet" href="../lib/bootstrap/css/bootstrap.min.css" /> <script type="text/javascript" src="../lib/bootstrap/js/bootstrap.min.js"></script> <script type="text/javascript" src="../lib/jquery/jquery.min.js"></script> <!--個別ファイル--> <script type="text/javascript" src="../js/TorokuFormConfirm.js"></script> </head> <body> <!--名前(姓)--> <div class="nameSeiArea"> <div class="nameSeiLabelTitle"> 名前(姓)<br />First Name </div> <div class="nameSeiInputTitle"> <input type="text" class="nameSeiInputClass" name="nameSei" id="nameSeiInputId" data-toggle="tooltip" title="名前(姓)を入力してください" required /> </div> </div> <!--名前(名)--> <div class="nameMeiArea"> <div class="nameMeiLabelTitle"> 名前(名)<br />Last Name </div> <div class="nameMeiInputTitle"> <input type="text" class="nameMeiInputClass" name="nameMei" id="nameMeiInputId" data-toggle="tooltip" title="名前(名)を入力してください" required /> </div> </div> <!--半角フリガナ(姓)--> <div class="hankakuHuriganaSeiArea"> <div class="hankakuHuriganaSeiLabelTitle"> 半角フリガナ(姓)<br />Half-Width Kana(First Name) </div> <div class="hankakuHuriganaSeiInputTitle"> <input type="text" class="hankakuHuriganaSeiInputClass" name="hankakuHuriganaSei" id="hankakuHuriganaSeiInputId" data-toggle="tooltip" title="半角フリガナ(姓)を入力してください" required /> </div> </div> <!--半角フリガナ(名)--> <div class="hankakuHuriganaMeiArea"> <div class="hankakuHuriganaMeiLabelTitle"> 半角フリガナ(名)<br />Half-Width Kana(Last Name) </div> <div class="hankakuHuriganaMeiInputTitle"> <input type="text" class="hankakuHuriganaMeiInputClass" name="hankakuHuriganaMei" id="hankakuHuriganaMeiInputId" data-toggle="tooltip" title="半角フリガナ(姓)を入力してください" required /> </div> </div> <!--性別--> <div class="sexArea"> <div class="sexLabelTitle"> 性別<br />Sex </div> <div class="sexInputTitle"> <input type="text" class="sexClass" name="sex" id="sexId" /> </div> </div> <!--会社名または学校名--> <div class="comnanySchoolNameArea"> <div class="comnanySchoolNameLabelTitle"> 会社名または学校名<br />Your Company or school Name </div> <div class="comnanySchoolNameInputTitle"> <input type="text" class="comnanySchoolNameInputClass" name="comnanySchoolName" id="comnanySchoolNameInputId" data-toggle="tooltip" title="会社名または学校名を入力してください" required /> </div> </div> <!--所属先名--> <div class="departmentNameArea"> <div class="departmentNameLabelTitle"> 所属先名<br />Your Department Name </div> <div class="departmentNameInputTitle"> <input type="text" class="departmentNameInputClass" name="departmentName" id="departmentNameInputId" data-toggle="tooltip" title="所属先名を入力してください" required /> </div> </div> <!--メールアドレス--> <div class="emailAddressArea"> <div class="emailAddressLabelTitle"> メールアドレス<br />E-mail Address </div> <div class="emailAddressInputTitle"> <input type="text" class="emailAddressInputClass" name="emailAddress" id="emailAddressInputId" data-toggle="tooltip" title="メールアドレスを入力してください" required /> </div> </div> <!--郵便番号--> <div class="addressArea"> <div class="addressLabelTitle"> 郵便番号<br />Post Address </div> <div class="addressInputTitle"> <input type="text" class="addressInputClass" name="address" id="addressInputId" data-toggle="tooltip" title="郵便番号を入力してください" required /> </div> <div class="addressBtnArea"> <button class="btn btn-primary" id="addressBtnId">自動検索</button> </div> </div> <!--都道府県名--> <div class="prefectureArea"> <div class="prefectureLabelTitle"> 都道府県名<br />Prefecture </div> <div class="prefectureInputTitle"> <input type="text" class="prefectureInputClass" name="prefecture" id="prefectureInputId" /> </div> </div> <!--市区町村名--> <div class="cityNameArea"> <div class="cityNameLabelTitle"> 市区町村名<br />City Name </div> <div class="cityNameInputTitle"> <input type="text" class="cityNameInputClass" name="cityName" id="cityNameInputId" /> </div> </div> <!--町名・番地名--> <div class="chomeBanchiNameArea"> <div class="chomeBanchiNameLabelTitle"> 町名・番地名<br />Chome Banchi Name </div> <div class="chomeBanchiNameInputTitle"> <input type="text" class="chomeBanchiNameInputClass" name="chomeBanchiName" id="chomeBanchiNameInputId" /> </div> </div> <!--電話番号--> <div class="phoneArea"> <div class="phoneLabelTitle"> 電話番号<br />Phone </div> <div class="phoneInputTitle"> <input type="text" class="phoneInputClass" name="phone" id="phoneInputId" data-toggle="tooltip" title="電話番号を入力してください" required /> </div> </div> <!--FAX--> <div class="faxArea"> <div class="faxLabelTitle"> Fax番号<br />Fax </div> <div class="faxInputTitle"> <input type="text" class="faxInputClass" name="fax" id="faxInputId" /> </div> </div> <!--パスワード--> <div class="passwordArea"> <div class="passwordLabelTitle"> パスワード<br />Password </div> <div class="passwordInputTitle"> <input type="text" class="passwordOneceInputClass" name="password" id="passwordOneceInputId" data-toggle="tooltip" title="パスワードを入力してください" required /> </div> </div> <!--メルマガ購読--> <div class="mailMagagineArea"> <div class="mailMagagineLabelTitle"> メルマガ購読する<br />Mail Magagine Subscribe </div> <div class="mailMagagineInputTitle"> <input type="text" class="mailMagagineInputClass" name="mailMagagine" id="mailMagagineInputId" />購読する </div> </div> <div class="backToPrePage"> <button class="btn btn-dark backToPrePageClass" id="backToPrePageId">前画面に戻る</button> </div> <div class="tourokuToDb"> <button type="button" class="btn btn-primary tourokuToDbClass" id="tourokuToDbId">登録する</button> </div> </body> </html>TorokuForm.js$(document).ready(function () { //確認画面から戻ってきたときの処理 var localData = localStorage.getItem('form_data'); //ローカルストレージから値を取得する。 localData = JSON.parse(localData); //ローカルストレージから取得した値をオブジェクトデータに戻す。 if (localData !== null) { for (var index in localData) { var data = localData[index]; var formName = data['name']; var formVal = data['value']; //もう一度値をセットする。 $('[name=' + formName + ']').val(formVal); } } //内容確認ボタンが押下された時の処理 $("#contentsCheckBtnId").click(function () { var nameSei = $("#nameSeiInputId").val(); //名前(姓) var nameMei = $("#nameMeiInputId").val(); //名前(名) var hankakuHuriganaSei = $("#hankakuHuriganaSeiInputId").val(); //半角フリガナ(姓) var hankakuHuriganaMei = $("#hankakuHuriganaMeiInputId").val(); //半角フリガナ(姓) var sex = $("input[name='sex']:checked").val(); //性別 var sex = $("input[name='sex']:checked").parent().text(); var comnanySchoolName = $("#comnanySchoolNameInputId").val(); //会社名または学校名 var departmentName = $("#departmentNameInputId").val(); //所属先 var emailAddress = $("#emailAddressInputId").val(); //E-mail var address = $("#addressInputId").val(); //郵便番号 var prefecture = $("#prefectureInputId").val(); //都道府県名 var cityName = $("#cityNameInputId").val(); //市区町村名 var chomeBanchiName = $("#chomeBanchiNameInputId").val(); //町名・番地名 var phone = $("#phoneInputId").val(); //電話番号 var fax = $("#faxInputId").val(); //Fax番号 var passwordTwice = $("#passwordTwiceInputId").val(); //パスワード var mailMagagine = ""; //メルマガの購読希望の判定 if ($("#mailMagagineInputId").prop("checked") === true) { mailMagagine = "購読希望する"; } else { mailMagagine = "購読希望しない"; } var sendData = { nameSeiData: nameSei, nameMeiData: nameMei, hankakuHuriganaSeiData: hankakuHuriganaSei, hankakuHuriganaMeiData: hankakuHuriganaMei, sexData: sex, comnanySchoolNameData: comnanySchoolName, departmentNameData: departmentName, emailAddressData: emailAddress, addressData: address, prefectureData: prefecture, cityNameData: cityName, chomeBanchiNameData: chomeBanchiName, phoneData: phone, faxData: fax, passwordTwiceData: passwordTwice, mailMagagineData: mailMagagine }; //フォームの内容をJSONデータで一括取得するコード var form = $(".tourokuForm"); // 値を保存しておきたいフォーム var formData = form.serializeArray(); //serializeArray()でフォームの内容をオブジェクト化 //var formJson = JSON.stringify(formData); //JSON.stringifyメソッドでそのデータをJSON化させる var formJson = JSON.stringify(sendData); //JSON.stringifyメソッドでそのデータをJSON化させる localStorage.setItem('form_data', formJson); //Jsonデータをローカルストレージに保存する。 location.href = "TorokuFormConfirm.html"; //TorokuFormConfirm.htmlへ遷移する。 }); });TorokuFormConfirm.js//import { parseJSON } from "jquery"; $(document).ready(function () { var localData = localStorage.getItem('form_data'); //ローカルストレージから値を取り出す。 localData = JSON.parse(localData); //ローカルデータから取得したJSONデータをオブジェクトへ戻す //ローカルストレージにデータがなければ null が返ってくるので、nullで分岐 if (localData !== null) { $("#nameSeiInputId").val(localData.nameSeiData); // $("#nameMeiInputId").val(localData.nameMeiData); // $("#hankakuHuriganaSeiInputId").val(localData.hankakuHuriganaSeiData); // $("#hankakuHuriganaMeiInputId").val(localData.hankakuHuriganaMeiData); // $("#sexId").val(localData.sexData); $("#comnanySchoolNameInputId").val(localData.comnanySchoolNameData); //会社名 $("#departmentNameInputId").val(localData.departmentNameData); //所属先名 $("#emailAddressInputId").val(localData.emailAddressData); //Emailアドレス $("#addressInputId").val(localData.addressData); //郵便番号 $("#prefectureInputId").val(localData.prefectureData); //都道府県名 $("#cityNameInputId").val(localData.cityNameData); //市町村名 $("#chomeBanchiNameInputId").val(localData.chomeBanchiNameData); //町名・番地名 $("#phoneInputId").val(localData.phoneData); //電話番号 $("#faxInputId").val(localData.faxData); //Fax $("#passwordOneceInputId").val("お客様が入力したパスワード"); //パスワード var inputPassWord = localData.passwordTwiceData; //パスワードは確認画面で表示せず、変数inputPassWordに格納する。 $("#mailMagagineInputId").val(localData.mailMagagineData); //メルマガ購読確認 //一連の処理が終わったタイミングなどで、ローカルストレージの情報を削除する。 localStorage.removeItem('form_data'); } //前画面に戻る時の処理 $("#backToPrePageId").click(function () { //前画面に戻るボタンを押下したときの処理 backToPrePageSetLocalStorage(); }); //DBに登録するときの処理 $("#tourokuToDbId").click(function () { torokuToDb(); }); }); /* //前画面に戻るボタンを押下したときの処理 function backToPrePageSetLocalStorage() { //フォームの内容をJSONデータで一括取得するコード var form = $(".tourokuForm"); var formData = form.serializeArray();//serializeArray()でフォームの内容をオブジェクト化 var formJson = JSON.stringify(formData); //JSON.stringifyメソッドでそのデータをJSON化させる localStorage.setItem('form_data', formJson); //ローカルストレージに保存する。 location.href = "TorokuForm.html"; } */ //DBに登録する処理 function torokuToDb() { //formタグのパラメーターをそれぞれの変数に格納する。 var nameSei = $("#nameSeiInputId").val(); //名前(姓) var nameMei = $("#nameMeiInputId").val(); //名前(名) var hankakuHuriganaSei = $("#hankakuHuriganaSeiInputId").val(); //半角フリガナ(姓) var hankakuHuriganaMei = $("#hankakuHuriganaMeiInputId").val(); //半角フリガナ(姓) var sex = $("#sexId").val(); //性別 var comnanySchoolName = $("#comnanySchoolNameInputId").val(); //会社名または学校名 var departmentName = $("#departmentNameInputId").val(); //所属先 var emailAddress = $("#emailAddressInputId").val(); //E-mail var address = $("#addressInputId").val(); //郵便番号 var prefecture = $("#prefectureInputId").val(); //都道府県名 var cityName = $("#cityNameInputId").val(); //市区町村名 var chomeBanchiName = $("#chomeBanchiNameInputId").val(); //町名・番地名 var phone = $("#phoneInputId").val(); //電話番号 var fax = $("#faxInputId").val(); //Fax番号 var passwordTwice = $("#passwordTwiceInputId").val(); //パスワード var mailMagagine = $("#mailMagagineInputId").val(); //メルマガの購読希望の判定 var torokuFormEntity = { nameSeiData: nameSei, nameMeiData: nameMei, hankakuHuriganaSeiData: hankakuHuriganaSei, hankakuHuriganaMeiData: hankakuHuriganaMei, sexData: sex, comnanySchoolNameData: comnanySchoolName, departmentNameData: departmentName, emailAddressData: emailAddress, addressData: address, prefectureData: prefecture, cityNameData: cityName, chomeBanchiNameData: chomeBanchiName, phoneData: phone, faxData: fax, passwordTwiceData: passwordTwice, mailMagagineData: mailMagagine }; var m = JSON.stringify(torokuFormEntity); console.log(m); //POST通信を実行する。 $.ajax({ url: "../api/TorokuForm/postTorokuData", type: "POST", data: JSON.stringify(torokuFormEntity), // m contentType: "application/json; charset=utf-8", success: function (data) { alert("OK通信"); }, error: function (xhr) { alert(xhr.status); } }); }TorokuFormController.csusing System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using WebApplication8.Dto; using WebApplication8.Setting; namespace WebApplication8.Controllers { [Route("api/TorokuForm")] //[Route("api/[controller]")] [ApiController] public class TorokuFormController : ControllerBase { /// <summary> /// 設定記述オブジェクト /// </summary> private readonly IOptions<DBSetting> options = null; /// <summary> /// インスタンス生成時に設定記述オブジェクトの取り込みを行う。 /// </summary> public TorokuFormController(IOptions<DBSetting> options) { //設定記述子 this.options = options; } [HttpPost("postTorokuData")] public void postTorokuData([FromBody]TorokuFormEntity torokuFormEntity) { //処理を書く。 } } }TorokuFormEntity.csusing System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace WebApplication8.Dto { public class TorokuFormEntity { public string nameSeiData { get; set; } public string nameMeiData { get; set; } public string hankakuHuriganaSeiData { get; set; } public string hankakuHuriganaMeiData { get; set; } public string sexData { get; set; } public string comnanySchoolNameData { get; set; } public string departmentNameData { get; set; } public string emailAddressData { get; set; } public string addressData { get; set; } public string prefectureData { get; set; } public string cityNameData { get; set; } public string chomeBanchiNameData { get; set; } public string phoneData { get; set; } public string faxData { get; set; } public string passwordTwiceData { get; set; } public string mailMagagineData { get; set; } } }確認画面にある登録ボタンを送信すると、無事Controllerクラス「TorokuFormController.cs」にリクエストパラメータが渡されている。
- 投稿日:2021-03-08T17:07:58+09:00
Blazor + Electron.NETでファイル操作を行いたいときの注意点
はじめに
以前Blazor + Electron.NETを試してみたという記事でBlazorで作成したWebアプリを簡単にデスクトップアプリとして扱えるようになることを紹介しました。その記事の最後にElectronのファイルダイアログを操作することができるということと、参考リンクの紹介をしました。参考リンクには書かれていない注意点があったため、今回はそのことについてまとめます。実際のファイル操作の実装は参考リンクが分かりやすいので、そちらを参照ください。
Electronのファイルダイアログ操作について
Electronでローカルファイルの選択ダイアログを実装するときには、dialogモジュールのshowOpenDialog関数を用います。詳しくはこちら。
Electronのdialogモジュールなどのリモートモジュールを使う際にWebPrefarenceのenableRemoteModuleというプロパティをtrueに設定しないと利用できないそうです。詳しくはこちら。Elecrron.NETを使用する場合のenableRemoteModuleプロパティの設定
Electron.NETを使用する際、この設定ができるAPIが公開されているのは最新のElectronNET.APIのみでした(2021/2/26に確認した時点でV11.5.1)。startup.csファイルでElectronのウィンドウを開く処理を行う際に、WebPreferencesの設定を行うことができます。
var browserWindow = await Electron.WindowManager.CreateWindowAsync(new BrowserWindowOptions { WebPreferences = new WebPreferences() { EnableRemoteModule = true }, });ElectronNET.APIの最新バージョンと対応するBlazorプロジェクトのフレームワークのバージョンについて
ElectronNET.APIの最新バージョンは.NET5に対応しています。Blazorのサーバーアプリのプロジェクトを作成した段階では、プロジェクトの対象のフレームワークが.NETCore 3.1で作成されるのではないかと思います。その状態でElectron.NETの最新バージョンをインストールしようとすると、.NETCore3.1と互換性が無いという旨のエラーが出てインストールできないためご注意ください。
また、Blazorのサーバーアプリではなく、Blazor WASMを使用することができないかも試しました。ElectronNET.APIをインストールしようとすると、上記と同様にBlazor WASMの対象フレームワークである.NETStandard2.1と互換性が無いという旨のエラーがでてインストールできないです。(ElectronNET.APIの以前のバージョンであっても.NETCoreにしか対応していないため、現状Blazor WASMとの組み合わせができないみたいです。)
したがって、現状Blazor + Electron.NETを使用してファイル操作も行うアプリの開発したい場合は
Blazorのサーバーアプリで対象フレームワークを.NET5にして、ElectronNET.APIの最新バージョンを使用するのがよさそうです。さいごに
少々細かい話ではありましたが、私が詰まった点でしたのでまとめした。
最後までお読みいただきありがとうございました。
- 投稿日:2021-03-08T16:08:36+09:00
EdgePCをDockerで運用するためのオレオレコンテナ管理ソフトFarming
はじめに
Dockerコンテナの起動、変更、削除を行うソフト勉強がてらを書きました。
Farmingとは
自身もDocker上で実行するコンテナ管理。
リモートからコンテナ設定情報を取得しコンテナを構成します
* 設定情報にないコンテナ→停止&削除(停止のみの設定も可)
* 設定上にあり実行していないコンテナ→実行(イメージが無い場合はPullして実行)
* バージョン違い→イメージが無い場合はPullして実行
が機能です。開発経緯
Edgeデバイス上のDockerでWeb開発する必要があり、デプロイそしてアップデートをどのように
簡略化できるかを考えていました。
当初HashiCorop社のNomadがフィットすると思い試していましたが、日本語のチュートリアルが少なく、
サーバ→クライアントと別PCでの構成に悩む。
やりたい事はシンプルで
* docker run
* docker start
* docker stop
* docker pull
* docker rm
このコマンドをリモートから実行
DockerAPIを実行すれば実現できることが分かりソフトに仕立てました
いづれはEdgePCが複数台になることからjsonファイルをEdgePCが参照しコンテナをオーケストレーションを目指しました課題
EdgePCのログ収集、構成ファイルダウンロード時の認証やEdgePCのグルーピングなどを組み込みたいと思っています
リポジトリ
DockerHub
- 投稿日:2021-03-08T16:08:36+09:00
EdgePCをDockerで運用するためのコンテナ管理ソフトFarming
はじめに
Dockerコンテナの起動、変更、削除を行うソフトを書きました。
Farmingとは
自身もDocker上で実行するコンテナ管理。
リモートからコンテナ設定情報を取得しコンテナを構成します
* 設定情報にないコンテナ→停止&削除(停止のみの設定も可)
* 設定上にあり実行していないコンテナ→実行(イメージが無い場合はPullして実行)
* バージョン違い→イメージが無い場合はPullして実行
が機能です。開発経緯
Edgeデバイス上のDockerでWeb開発する必要があり、デプロイそしてアップデートをどのように
簡略化できるかを考えていました。
当初HashiCorop社のNomadがフィットすると思い試していましたが、日本語のチュートリアルが少なく、
サーバ→クライアントと別PCでの構成に悩む。
やりたい事はシンプルで
* docker run
* docker start
* docker stop
* docker pull
* docker rm
このコマンドをリモートから実行
DockerAPIを実行すれば実現できることが分かりソフトに仕立てました
いづれはEdgePCが複数台になることからjsonファイルをEdgePCが参照しコンテナをオーケストレーションを目指しました課題
EdgePCのログ収集、構成ファイルダウンロード時の認証やEdgePCのグルーピングなどを組み込みたいと思っています
リポジトリ
DockerHub
- 投稿日:2021-03-08T15:22:28+09:00
C#/Linq で シーケンスの完全一致をチェックする
2つのシーケンスの内容を比較して、それぞれの要素がもう片方に必ず存在することを確認する
using System.Collections.Generic; using System.Linq; public class Hello{ public static void Main(){ // Your code here! var l1 = new List<int>(){1,2}; var l2 = new List<int>(){1,2}; var result = l1.All(y => l2.Any(l => l == y)) && l2.All(y => l1.Any(l => l == y)); System.Console.WriteLine(result); } }
- 投稿日:2021-03-08T08:58:30+09:00
Unityのエラー『All Compiler Errors Have To Be〜』と『error CS0234: The type or namespace name〜』の解決方法をまとめる【備忘録】
ユニティちゃん入れて実行したらエラー出たんで、解決方法を備忘録的にまとめていきます。
エラー内容はタイトルにある通りです。
エラー1つ目
”All Compiler Errors Have To Be Fixed Before You Can Enter Playmode!”エラー2つ目
error CS0234: The type or namespace name 'Policy' does not exist in the namespace 'System.Security' (are you missing an assembly reference?)順番に解説していきます。
”All Compiler Errors...”の意味→エラー出てるから直せ
All Compiler Errors Have To Be Fixed Before You Can Enter Playmode!”こいつをgoogle翻訳にかけると、
「プレイモードに入る前に、すべてのコンパイラエラーを修正する必要があります!」
とのこと。
なるほど、どうやらどこかでエラーが出てるらしいですね...ってことで、Unityのコンソール内容を確認したところ、、、
error CS0234: The type or namespace name 'Policy' does not exist in the namespace 'System.Security' (are you missing an assembly reference?)とのことです。
例のごとくgoogle翻訳にかける。英訳
エラーCS0234:タイプまたは名前空間名「ポリシー」が名前空間「System.Security」に存在しません(アセンブリ参照がありませんか?)
いや、アセンブリの参照とか知りませんわ、って話。
引き続きエラー内容で調査すると、先人の記事を発見しました。【Unity】Unity-Chan!(ユニティちゃん)でCS0234エラーが発生したときの調査結果と解決方法 - Qiita
こちらの記事によると、スクリプト内のusing節から
System.Security.Policy
をコメントアウトし、セーブすればOKとのことです。
早速やっていきましょう。『AutoBlink.cs』の内容を修正
エラーが出てると言われたスクリプトファイル、
AutoBlink.cs
を修正していきます。スクリプトのファイルパス
Assets/UnityChan/Scripts/AutoBlink.cs
//エラー修正前 // //AutoBlink.cs //オート目パチスクリプト //2014/06/23 N.Kobayashi // using UnityEngine; using System.Collections; using System.Security.Policy;//エラー修正後 // //AutoBlink.cs //オート目パチスクリプト //2014/06/23 N.Kobayashi // using UnityEngine; using System.Collections; //using System.Security.Policy;//←ここをコメントアウト修正してビルドをかけたら直りました。
先人に感謝です。参考記事にはこのような事も書かれてました。
Unity Japan公式に問い合わせたところ、使っていないので消しちゃって大丈夫との返事をもらったそうです。
とのことらしいです。
最新バージョンとかでは修正されてるらしいので、
AutoBlink.cs
のファイル自体を新しくするって解決策もあるようです。所感
エラーを調べてたら、次なるエラーが出てきて、それを調べてたらまた次のエラーが出てきてそれを調べてたら。。。
エンジニアの領域って、コード書いてる時間より、エラーを解決してる時間の方が長いよね
って感じてます。まぁクリエイティブって、そういう事ですもんね。
でもありがたいことに、先人達が答えをおいてくれてるんで助かってます。
Qiita万歳、ネット社会万歳。エラー内容でググれば、たいてい事は何とかなる
(気がする…)引き続き頑張ろ。