2

同様の質問をいくつか見つけました。ここにある「MultipleButtonAttribute」を使用したソリューションが気に入っています: ASP.NET MVC フレームワークで複数の送信ボタンを処理するにはどうすればよいですか?
しかし、私は別の解決策を思いついたので、それをコミュニティと共有しようと思いました.

4

1 に答える 1

2

そのため、まず、着信要求を処理する ModelBinder を作成します。
私は制限をしなければなりません。入力/ボタン要素の ID と名前は、"cmd" のプレフィックスである必要があります。

  public class CommandModelBinder<T> : IModelBinder
  {
    public CommandModelBinder()
    {
      if (!typeof(T).IsEnum)
      {
        throw new ArgumentException("T must be an enumerated type");
      }
    }

    public object BindModel(System.Web.Mvc.ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
      string commandText = controllerContext.HttpContext.Request.Form.AllKeys.Single(key => key.StartsWith("cmd"));
      return Enum.Parse(typeof (T), commandText.Substring(3));
    }
  }

もちろん、App_Start の web.config を介して変更または構成可能にすることができます。
次に作成するのは、必要な HTML マークアップを生成するための HtmlHelper 拡張機能です。

public static MvcHtmlString CommandButton<T>(this HtmlHelper helper, string text, T command)
{
  if (!command.GetType().IsEnum) throw new ArgumentException("T must be an enumerated type");
  string identifier = "cmd" + command;
  TagBuilder tagBuilder = new TagBuilder("input");
  tagBuilder.Attributes["id"] = identifier;
  tagBuilder.Attributes["name"] = identifier;
  tagBuilder.Attributes["value"] = text;
  tagBuilder.Attributes["type"] = "submit";
  return new MvcHtmlString(tagBuilder.ToString());
}

これはまだテクニカル デモであるため、html 属性とその他のスーパー オーバーロードは、独自に開発するのを待っています。
ここで、コードを試すためにいくつかの列挙を行う必要があります。それらは一般的なものでも、コントローラー固有のものでもかまいません。

  public enum IndexCommands
  {
    Save,
    Cancel
  }

  public enum YesNo
  {
    Yes,
    No
  }  

次に、列挙とバインダーをペアにします。App_Start フォルダー内の別のファイルで行います。ModelBinderConfig.

  ModelBinders.Binders.Add(typeof(IndexCommands), new CommandModelBinder<IndexCommands>());
  ModelBinders.Binders.Add(typeof(YesNo), new CommandModelBinder<YesNo>());

すべてを設定したら、コードを試すアクションを実行します。私はそれをシンプルに保ちました:

public ActionResult Index()
{
  return View();
}

[HttpPost]
public ActionResult Index(IndexCommands command)
{
  return View();
}

そして、私の見解は次のようになります。

@using (Html.BeginForm())
{
  @Html.CommandButton("Save", IndexCommands.Save)
  @Html.CommandButton("Cancel", IndexCommands.Cancel)
}

これがコードを明確にし、タイプセーフで読みやすくするのに役立つことを願っています。

于 2013-07-05T12:34:58.973 に答える