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のサンプル