| C# サンプル集 | 
Visual Basic 中学校 > C# サンプル集 > C# サンプル集目次 > ASP.NET Core > Razor Pages
input要素の値を取得する
2023/12/31
この記事は ASP.NET Core Razor Pages を対象にしています。
この記事内のサンプルは、プロジェクトテンプレート「ASP.NET Core Web アプリ」を使用して、PagesフォルダーにRazorページを追加する前提です。
目次
input要素の値を取得する(HTTP POST版)
ReadTextBoxOnPost.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages
{
    public class ReadTextBoxOnPostModel : PageModel
    {
        [BindProperty]
        public string? value1 { get; set; } = "def";
        [BindProperty]
        public int value2 { get; set; } = 123;
        public void OnPost()
        {
            System.Diagnostics.Debug.WriteLine(value1);
            System.Diagnostics.Debug.WriteLine(value2);
        }
    }
}
					
					
ReadTextBoxOnPost.cshtml
@page
@model WorkStandard.Pages.ReadTextBoxOnPostModel
<form method="post">
    <input asp-for="value1" />
    <input asp-for="value2" />
    <input type="submit" />
</form>
input要素の値を取得する(HTTP GET版)
ReadTextBoxOnGet.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages
{
    public class ReadTextBoxOnGetModel : PageModel
    {
        [BindProperty(SupportsGet = true)]
        public string? value1 { get; set; } = "abc";
        [BindProperty(SupportsGet = true)]
        public int value2 { get; set; } = 123;
        public void OnGet()
        {
            System.Diagnostics.Debug.WriteLine(value1);
            System.Diagnostics.Debug.WriteLine(value2);
        }
    }
}
					
					
ReadTextBoxOnGet.cshtml
@page
@model WorkStandard.Pages.ReadTextBoxOnGetModel
<form>
    <input asp-for="value1" />
    <input asp-for="value2" />
    <input type="submit" />
</form>
入力された数値の合計を表示する(HTTP POST版)
					
CalcSimpleAddOnPost.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages
{
    public class CalcSimpleAddOnPostModel : PageModel
    {
        [BindProperty]
        public int value1 { get; set; } = 2;
        [BindProperty]
        public int value2 { get; set; } = 3;
        public int result;
        public void OnPostAdd()
        {
            result = value1 + value2;
        }
    }
}
					
CalcSimpleAddOnPost.cshtml
@page
@model WorkStandard.Pages.CalcSimpleAddOnPostModel
<form method="post">
    <div class="mb-3">
        <input asp-for="value1" /> + <input asp-for="value2" /> =
    </div>
    <div class="mb-3">
        <input value="計算" type="submit" asp-page-handler="Add" class="btn btn-primary" />
    </div>
    <div>
        答えは @Model.result です。
    </div>
</form>
					主なCSSクラスの効果
入力された数値の合計を表示する(HTTP GET版)
					
CalcSimpleAddOnGet.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages
{
    public class CalcSimpleAddOnGetModel : PageModel
    {
        [BindProperty(SupportsGet = true)]
        public int value1 { get; set; } = 2;
        [BindProperty(SupportsGet = true)]
        public int value2 { get; set; } = 3;
        public int result;
        public void OnGetAdd()
        {
            result = value1 + value2;
        }
    }
}
					
CalcSimpleAddOnGet.cshtml
@page
@model WorkStandard.Pages.CalcSimpleAddOnGetModel
<form>
    <div class="mb-3">
        <input asp-for="value1" /> + <input asp-for="value2" /> =
    </div>
    <div class="mb-3">
        <input value="計算" type="submit" class="btn btn-primary" />
        <input type="hidden" name="handler" value="Add" />
    </div>
    <div>
        答えは @Model.result です。
    </div>
</form>
					メモ:OnGetAdd を呼び出すために、hiddenを使って handler に Add を送信するようにしています。
主なCSSクラスの効果
たくさんのinput要素の値を取得する(HTTP POST版)
ReadManyItemsOnPost.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages
{
    public class ReadManyItemsOnPostModel : PageModel
    {
        [BindProperty]
        public FormItems items { get; set; } = new FormItems();
        public void OnPost()
        {
            System.Diagnostics.Debug.WriteLine(items.strValue1);
            System.Diagnostics.Debug.WriteLine(items.strValue2);
            System.Diagnostics.Debug.WriteLine(items.intValue);
            System.Diagnostics.Debug.WriteLine(items.dateValue);
        }
        public class FormItems
        {
            public string? strValue1 { get; set; } = "abc";
            public string? strValue2 { get; set; } = "def";
            public int intValue { get; set; } = 123;
            public DateTime dateValue { get; set; } = new DateTime(2023, 11, 9, 7, 12, 23);
        }
    }
}
					
					
ReadTextBoxOnPost.cshtml
@page
@model WorkStandard.Pages.ReadManyItemsOnPostModel
<form method="post">
    <div>
        <input asp-for="items.strValue1" />
    </div>
    <div>
        <input asp-for="items.strValue2" />
    </div>
    <div>
        <input asp-for="items.intValue" />
    </div>
    <div>
        <input asp-for="items.dateValue" />
    </div>
    <div>
        <input type="submit" />
    </div>
</form>
たくさんのinput要素の値を取得する(HTTP GET版)
ReadManyItemsOnGet.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages
{
    public class ReadManyItemsOnGetModel : PageModel
    {
        [BindProperty(SupportsGet = true)]
        public FormItems items { get; set; } = new FormItems();
        public void OnGet()
        {
            System.Diagnostics.Debug.WriteLine(items.strValue1);
            System.Diagnostics.Debug.WriteLine(items.strValue2);
            System.Diagnostics.Debug.WriteLine(items.intValue);
            System.Diagnostics.Debug.WriteLine(items.dateValue);
        }
        public class FormItems
        {
            public string? strValue1 { get; set; } = "abc";
            public string? strValue2 { get; set; } = "def";
            public int intValue { get; set; } = 123;
            public DateTime dateValue { get; set; } = new DateTime(2023, 11, 9, 7, 12, 23);
        }
    }
}
					
					
ReadTextBoxOnPost.cshtml
@page
@model WorkStandard.Pages.ReadManyItemsOnGetModel
<form>
    <div>
        <input asp-for="items.strValue1" />
    </div>
    <div>
        <input asp-for="items.strValue2" />
    </div>
    <div>
        <input asp-for="items.intValue" />
    </div>
    <div>
        <input asp-for="items.dateValue" />
    </div>
    <div>
        <input type="submit" />
    </div>
</form>
input要素の値を引数として取得する(HTTP POST版)
ReadWithParamOnPost.cshtml.cs
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages.simpleio
{
    public class ReadWithParamOnPostModel : PageModel
    {
        public void OnPost(string value1, int value2)
        {
            System.Diagnostics.Debug.WriteLine(value1);
            System.Diagnostics.Debug.WriteLine(value2);
        }
    }
}
					
					メモ:2つ目のinputに数値以外を入力するとvalue2は0になります。
ReadWithParamOnPost.cshtml
@page
@model WorkStandard.Pages.simpleio.ReadWithParamOnPostModel
<form method="post">
    <input type="text" name="value1" />
    <input type="text" name="value2" />
    <input type="submit" />
</form>
これでもできます。
ReadWithIFormCollectionParamOnPost.cshtml.cs
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages.simpleio
{
    public class ReadWithIFormCollectionParamOnPostModel : PageModel
    {
        public void OnPost(IFormCollection data)
        {
            string value1 = data["value1"]!;
            //value2 は数値に変換できない場合 0 にします。
            int value2 = 0;
            int.TryParse(data["value2"], out value2);
            System.Diagnostics.Debug.WriteLine(value1);
            System.Diagnostics.Debug.WriteLine(value2);
        }
    }
}
					
					メモ:IFormCollection型の値は引数として受け取る以外に、HttpContext.Request.ReadFormAsyncメソッドの戻り値として受け取ることもできます。
ReadWithIFormCollectionParamOnPost.cshtml
@page
@model WorkStandard.Pages.simpleio.ReadWithIFormCollectionParamOnPostModel
<form method="post">
    <input type="text" name="value1" />
    <input type="text" name="value2" />
    <input type="submit" />
</form>
これでもできます。
ReadWithDictionaryParamOnPostModel.cshtml.cs
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages.simpleio
{
    public class ReadWithDictionaryParamOnPostModel : PageModel
    {
        public void OnPost(Dictionary<string, string> data)
        {
            string value1 = data["value1"];
            //value2 は数値に変換できない場合 0 にします。
            int value2 = 0;
            int.TryParse(data["value2"], out value2);
            System.Diagnostics.Debug.WriteLine(value1);
            System.Diagnostics.Debug.WriteLine(value2);
        }
    }
}
					
					
ReadWithDictionaryParamOnPostModel.cshtml
@page
@model WorkStandard.Pages.simpleio.ReadWithDictionaryParamOnPostModel
<form method="post">
    <input type="text" name="value1" />
    <input type="text" name="value2" />
    <input type="submit" />
</form>
input要素の値を引数として取得する(HTTP GET版)
ReadWithParamOnGet.cshtml.cs
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages.simpleio
{
    public class ReadWithParamOnGetModel : PageModel
    {
        public void OnGet(string value1, int value2)
        {
            System.Diagnostics.Debug.WriteLine(value1);
            System.Diagnostics.Debug.WriteLine(value2);
        }
    }
}
					
					メモ:2つ目のinputに数値以外を入力するとvalue2は0になります。
ReadWithParamOnGet.cshtml
@page
@model WorkStandard.Pages.simpleio.ReadWithParamOnGetModel
<form>
    <input type="text" name="value1" />
    <input type="text" name="value2" />
    <input type="submit" />
</form>
これでもできます。
ReadWithDictionaryParamOnGetModel.cshtml.cs
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace WorkStandard.Pages.simpleio
{
    public class ReadWithDictionaryParamOnGetModel : PageModel
    {
        public void OnGetTest(Dictionary<string, string> data)
        {
            string value1 = data["value1"];
            //value2 は数値に変換できない場合 0 にします。
            int value2 = 0;
            int.TryParse(data["value2"], out value2);
            System.Diagnostics.Debug.WriteLine(value1);
            System.Diagnostics.Debug.WriteLine(value2);
        }
    }
}
					
					メモ:初回に実行されないようにOnGet ではなく、OnGetTest にしました。OnGetだと初回実行されたときに何も値が入っていないので、data["value1"]でエラーになります。
ReadWithDictionaryParamOnGetModel.cshtml
@page
@model WorkStandard.Pages.simpleio.ReadWithDictionaryParamOnGetModel
<form>
    <input type="text" name="value1" />
    <input type="text" name="value2" />
    <input type="submit" />
    <input type="hidden" name="handler" value="Test" />
</form>
					メモ:OnGetTest の方を呼び出すために、hiddenを使って handler に Test を送信するようにしています。