上記の問題を解決する方法は3つあります
- HTMLの方法
- jqueryの方法
- 「ActionNameSelectorAttribute」の方法
以下は、3つのアプローチすべてを実証的に要約したビデオです。
https://www.facebook.com/shivprasad.koirala/videos/vb.100002224977742/809335512483940
HTMLの方法:-
HTMLの方法では、2つのフォームを作成し、各フォーム内に「送信」ボタンを配置する必要があります。そして、すべてのフォームのアクションは、異なる/それぞれのアクションを指します。以下のコードを見ると、最初のフォームが「Action1」に投稿されており、2番目のフォームは、「送信」ボタンがクリックされたことに応じて「Action2」に投稿されます。
<form action="Action1" method=post>
<input type=”submit” name=”Submit1”/>
</form>
<form action="Action2" method=post>
<input type=”submit” name=”Submit2”>
</form>
Ajaxの方法:-
あなたがAjax愛好家である場合、この2番目のオプションはあなたをさらに興奮させます。Ajaxの方法では、2つの異なる関数「Fun1」と「Fun1」を作成できます。以下のコードを参照してください。これらの関数は、JQUERYまたはその他のフレームワークを使用してAjax呼び出しを行います。これらの各機能は、「送信」ボタンの「OnClick」イベントにバインドされています。これらの各関数は、それぞれのアクション名を呼び出します。
<Script language="javascript">
function Fun1()
{
$.post(“/Action1”,null,CallBack1);
}
function Fun2()
{
$.post(“/Action2”,null,CallBack2);
}
</Script>
<form action="/Action1" method=post>
<input type=submit name=sub1 onclick=”Fun2()”/>
</form>
<form action="/Action2" method=post>
<input type=submit name=sub2 onclick=”Fun1()”/>
</form>
「ActionNameSelectorAttribute」の使用:-
これはすばらしいクリーンなオプションです。「ActionNameSelectorAttribute」は、実行可能なアクションを決定する意思決定ロジックを記述できる単純な属性クラスです。
したがって、最初にHTMLで、サーバー上でボタンを識別するために送信ボタンに適切な名前を付ける必要があります。
ボタンの名前に「保存」と「削除」を追加したことがわかります。また、特定のアクション名ではなく、コントローラー名「Customer」を付けただけのアクションに気付くでしょう。アクション名は「ActionNameSelectorAttribute」によって決定されると予想されます。
<form action=”Customer” method=post>
<input type=submit value="Save" name="Save" /> <br />
<input type=submit value="Delete" name="Delete"/>
</form>
そのため、送信ボタンがクリックされると、最初に「ActionNameSelector」属性がヒットし、次にどの送信が起動されるかに応じて、適切なアクションが呼び出されます。
したがって、最初のステップは、「ActionNameSelectorAttribute」クラスから継承するクラスを作成することです。このクラスでは、単純なプロパティ「Name」を作成しました。
また、trueまたはflaseを返す「IsValidName」関数をオーバーライドする必要があります。この関数は、アクションを実行する必要があるかどうかに関係なく、ロジックを書き込む場所です。したがって、この関数がtrueを返す場合、アクションが実行されるか、そうでない場合です。
public class SubmitButtonSelector : ActionNameSelectorAttribute
{
public string Name { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo)
{
// Try to find out if the name exists in the data sent from form
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
}
}
上記の関数の中心は、以下のコードにあります。「ValueProvider」コレクションには、フォームから投稿されたすべてのデータが含まれます。したがって、最初に「名前」の値を検索し、HTTPリクエストで見つかった場合はtrueを返し、そうでない場合はfalseを返します。
var value = controllerContext.Controller.ValueProvider.GetValue(Name);
if (value != null)
{
return true;
}
return false;
次に、この属性クラスをそれぞれのアクションに装飾し、それぞれの「名前」値を指定できます。そのため、送信がこのアクションにヒットし、名前がHTML送信ボタンの名前と一致する場合は、アクションがさらに実行されるか、そうでない場合に実行されます。
public class CustomerController : Controller
{
[SubmitButtonSelector(Name="Save")]
public ActionResult Save()
{
return Content("Save Called");
}
[SubmitButtonSelector(Name = "Delete")]
public ActionResult Delete()
{
return Content("Delete Called");
}
}