一个干净的解决方案,在ASP.NET MVC中使用多个提交按钮

时间:2013-07-05 12:34:59

标签: asp.net-mvc asp.net-mvc-4

我发现了一些类似的问题,我喜欢在这里找到“MultipleButtonAttribute”的解决方案:How do you handle multiple submit buttons in ASP.NET MVC Framework?
但我想出了另一种解决方案,我想我会与社区分享。

1 个答案:

答案 0 :(得分: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对其进行更改或配置 我接下来要做的是一个HtmlHelper扩展来生成必要的HTML标记:

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)
}

希望这有助于保持代码清晰,输入安全且易读。