概要
入力フォームを作る際に、複数のsubmitボタンがあったので、その処理をつくったときのメモ。
今回、セレクター属性を作成して、アクションメソッドにその属性を設定しました。
環境
C# 7.3
ASP.NET MVC 5.2.7
参考
方法
ModelsフォルダにMultipleButtonAttributeクラスを作成。
MultipleButtonAttributeクラス
using System;
using System.Web;
using System.Web.Mvc;
using System.Reflection;
namespace InputForm.Models
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
public string Name { get; set; }
public string Argument { get; set; }
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
var isValidName = false;
var keyValue = string.Format("{0}:{1}", Name, Argument);
var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);
if (value != null)
{
controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
isValidName = true;
}
return isValidName;
}
}
}
CSHTML
@using (Html.BeginForm())
{
<form>
<input type="submit" name="action:Cancel" value="キャンセル">
<input type="submit" name="action:Save" value="保存">
</form>
}
コントローラー
//ビュー表示用
public ActionResult Input(InputContents input)
{
ViewBag.SelectOptions = new SelectListItem[]
{
new SelectListItem(){Value="1",Text="text1"},
new SelectListItem(){Value="2",Text="text2"},
new SelectListItem(){Value="3",Text="text3"}
};
return View(input);
}
//キャンセルボタンが押されたときに呼び出される
[HttpPost]
[MultipleButton(Name = "action", Argument = "Cancel")]
public ActionResult Cancel(InputContents input)
{
return View("Input", input);
}
//保存ボタンが押されたときに呼び出される
[HttpPost]
[MultipleButton(Name = "action", Argument = "Save")]
public ActionResult Save(InputContents input)
{
return View("Input", input);
}
コントローラーには上記のsubmitを受け取るアクションメソッド、Cancel、Saveとともに、Inputというビューを表示させるための、アクションメソッドがあります。
最後に
この記事の趣旨とは異なってしまうのですが、ASP.NETではアクションメソッドでViewを返す際、アクションメソッドを明示しない場合、そのアクションメソッドと同じ名前のcshtmlファイルを探すことをしらずに詰まってしまいました。この記事の記載内容は参考にしたページとほとんど同じなのですが、Viewに返すアクションメソッドを明示的に指定してあります。