(ASP.NETとVB.NET) 押されたボタンを属性で判別

ASP.NETとVB.NETの押されたボタンを属性で判別するサンプルです。

目次

サンプル 押されたボタンを属性で判別する
  ボタンのnameの値が同じ場合

押されたボタンを属性で判別する

1.Index.vbhtmlにボタンが2つあり、ボタンを押すとTest1Controller.vbへ送信します。

2.ButtonTestAttribute.vbでどちらのボタンが押されたか判別します。

3.Test1Controller.vbで押されたボタンの処理が実行されます。

https://localhost:44320/Test1/Index

 

ビュー(Index.vbhtml)

ボタンのnameの値が異なる場合です。nameの値で判定します。

@ModelType new0901.ActionForm1
@Code
	Layout = Nothing
End Code
<!DOCTYPE html>
<html>
<head>
</head>
<body><p>@Model.text1</p>
	@Using Html.BeginForm("Display1", "Test1", FormMethod.Post, New With {.id = "form1"})
		@<input type="submit" name="Create" />
		@<input type="submit" name="Delete" />
	End Using
</body>
</html>

 

コントローラ(Test1Controller.vb)

<>の箇所が押されたボタンを判別する属性です。

Imports asp_test1.Attribute

Namespace Controllers
	Public Class Test1Controller
		Inherits Controller

		<HttpGet>
		Function Index() As ActionResult
			Return View()
		End Function

		<HttpPost>
		<ButtonTest(TestValue:="Create")>
		Function Proc1() As ActionResult
			Return Content("create")
		End Function

		<HttpPost>
		<ButtonTest(TestValue:="Delete")>
		Function Proc2() As ActionResult
			Return Content("delete")
		End Function
	End Class
End Namespace

7~10行目は、初期表示で使用しています。
13,19行目は、属性です。ButtonTestは、後述のButtonTestAttributeとひも付きます。
ビューのCreateボタンが押されたときは14行目が実行されます。
Deleteボタンが押されたときは20行目が実行されるようにします。

 

Attributeクラス(ButtonTestAttribute.vb)

ActionNameSelectorAttributeクラスを継承します(5行目)。
9行目のIsValidNameメソッドはオーバーライドで設定されるので内容を記述します。

Imports System.Reflection
Namespace Attribute
	<System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple:=True)>
	Public Class ButtonTestAttribute
		Inherits ActionNameSelectorAttribute

		Public Property TestValue As String

		Public Overrides Function IsValidName(
				controllerContext As ControllerContext, actionName As String,
				methodInfo As MethodInfo) As Boolean
			IsValidName = False
			Dim value =
				controllerContext.Controller.ValueProvider.GetValue(TestValue)
			If value Is Nothing = False Then
				IsValidName = True
			End If
			Return IsValidName
		End Function
	End Class
End Namespace

コントローラに<ButtonTest~>が2つあるので7~19行目は、2回実行されます。

Createボタンを押したときの流れ

Createのボタンを押すと7行目の値は"Create"になります。
13,14行目は、"Create"を引数にして戻り値はValueProviderResultオブジェクトです。
15行目は、ValueProviderResultオブジェクトが存在するのでtrueになります。

次に7行目が"Delete"になります。
13,14行目は、"Delete"を引数にして戻り値はNothingです。
15行目は、ValueProviderResultオブジェクトが存在しないのでfalseになります。

コントローラ(Test1Controller.vb)では、14行目が実行されます。

 

ボタンのnameの値が同じ場合

ボタンのnameの値が同じ場合です。nameとvalueの値で判定します。

ビュー(Index.vbhtml)

@Code
	Layout = Nothing
End Code
<!DOCTYPE html>
<html>
<head>
</head>
<body>
	@Using Html.BeginForm("Display1", "Test1", FormMethod.Post, New With {.id = "form1"})
		@<input type="submit" name="button1" value="Create" />
		@<input type="submit" name="button1" value="Delete" />
	End Using
</body>
</html>

10,11行目は、nameの値が同じです。valueの値は異なります。

コントローラ(Test1Controller.vb)

<>の箇所が押されたボタンを判別する属性です。

Imports asp_test1.Attribute

Namespace Controllers
	Public Class Test1Controller
		Inherits Controller

		<HttpGet>
		Function Index() As ActionResult
			Return View()
		End Function

		<HttpPost>
		<ButtonTest(TestKey:="button1", TestValue:="Create")>
		Function Proc1() As ActionResult
			Return Content("create")
		End Function

		<HttpPost>
		<ButtonTest(TestKey:="button1", TestValue:="Delete")>
		Function Proc2() As ActionResult
			Return Content("delete")
		End Function
	End Class
End Namespace

7~10行目は、初期表示で使用しています。
13,19行目は、属性です。ButtonTestは、後述のButtonTestAttributeとひも付きます。
ビューのCreateボタンが押されたときは14行目、Deleteボタンが押されたときは20行目が実行されるようにします。

Attributeクラス(ButtonTestAttribute.vb)

ActionNameSelectorAttributeクラスを継承します(5行目)。
10行目のIsValidNameメソッドはオーバーライドで設定されるので内容を記述します。

Imports System.Reflection
Namespace Attribute
	<System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple:=True)>
	Public Class ButtonTestAttribute
		Inherits ActionNameSelectorAttribute

		Public Property TestKey As String
		Public Property TestValue As String

		Public Overrides Function IsValidName(
				controllerContext As ControllerContext, actionName As String,
				methodInfo As MethodInfo) As Boolean
			IsValidName = False
			Dim value = controllerContext.HttpContext.Request.Form(TestKey)
			If value Is Nothing = False Then
				IsValidName = value.Equals(TestValue)
			End If
			Return IsValidName
		End Function
	End Class
End Namespace

Createボタンを押したときの流れ

Createのボタンを押すと7行目の値は"button1"、8行目の値は"Create"になります。
14行目は、"button1"を引数にして戻り値は"Create"です。
15行目は、"Create"は存在するのでtrueになります。
16行目は、"Create"と"Create"を比較するのでTrueになります。

次に7行目の値は"button1"、8行目の値は"Delete"になります。
14行目は、"button1"を引数にして戻り値は"Create"です。
15行目は、"Create"は存在するのでtrueになります。
16行目は、"Create"と"Delete"を比較するのでFalseになります。

コントローラ(Test1Controller.vb)では、14行目が実行されます。

関連の記事

(ASP.NETとVB.NET) POSTで値を別画面に渡す
(ASP.NETとVB.NET) JsonResultでJSONを返す
(ASP.NETとVB.NET) RedirectToActionのサンプル

△上に戻る