处理表单中的多个提交按钮

时间:2013-09-16 13:12:56

标签: asp.net-mvc-3

我正在寻找处理多个提交按钮的好方法,然后我从这个网址得到了一些建议,我跟着但失败了。 How do you handle multiple submit buttons in ASP.NET MVC Framework?

@Andrey Shchekin发表。

他只是说创建一个类似于下面的类,所以我在同一个控制器中做了

public class HttpParamActionAttribute : ActionNameSelectorAttribute {
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) {
        if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
            return true;

        if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase))
            return false;

        var request = controllerContext.RequestContext.HttpContext.Request;
        return request[methodInfo.Name] != null;
    }
} 

然后视图中的多个提交按钮看起来像&控制器代码如下所示

<% using (Html.BeginForm("Action", "Post")) { %>
  <!— …form fields… -->
  <input type="submit" name="saveDraft" value="Save Draft" />
  <input type="submit" name="publish" value="Publish" />
<% } %> 

and controller with two methods

public class PostController : Controller {
    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SaveDraft(…) {
        //…
    }

    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Publish(…) {
        //…
    } 
}

但是当我测试他的代码时,它永远不会工作。所以任何人都可以告诉我在哪里犯错误或者代码本身对于处理这种情况是错误的。感谢

2 个答案:

答案 0 :(得分:4)

查看:

<input type="submit" name="mySubmit" value="Save Draft" />
<input type="submit" name="mySubmit" value="Publish" />

控制器操作:

[HttpPost]
public ActionResult ActionName(ModelType model, string mySubmit)
{
   if(mySubmit == "Save Draft")
   {
      //save draft code here
   } else if(mySubmit == "Publish")
   {
      //publish code here
   }
}

答案 1 :(得分:1)

当我要求用户可以最终确定或保存医院婴儿记录的进度时,我必须处理类似的情况 - 基本上两个动作都是提交但是一个验证了插入主DB表的记录而另一个保存了它没有任何验证就进入临时表。我像这样处理它:

我有2个按钮都是提交不同ID的类型(btnSave和btnFinalize)。单击btnSave时,我使用一些JQuery代码拦截该事件:

$("#btnSave").click(function () {
   $("#SaveForm").validate().settings.rules = null;
   $('#SaveForm').attr('action', '@(Url.Content("~/Home/EditCase?finalize=false"))');
});

正如您所看到的,我将表单的action属性修改为指向具有finalize = false的查询字符串属性的其他URL。我还删除了模型上的任何验证。如果单击其他按钮,则不执行任何操作 - 执行默认行为。

在我的控制器中,我有一个处理两个提交动作的动作:

public ActionResult EditCase(EditInfantModel model, bool finalize = true)
{
    // Logic for handling submit in here...
}

我认为你可以为你的问题应用类似的技术。我不确定这是你正在寻找的答案,但我认为值得一提......