如何将按钮的值传递到控制器?

8

我有一个视图,里面有两个按钮:“是”和“否”。 如果我点击“是”,将会重定向到另一个页面,如果我点击“否”,将会重定向到另一个页面。

这是我的视图。

@using (Html.BeginForm())
 { 
<table  >
 <tr>
    <td >
      Ceremony : 
    </td>
    <td>
       Ceremony at @Model.ceremony_date

    </td>
</tr>

  <tr>
            <td >
              Name :
            </td>
            <td >
               @Model.first_name  @Model.middle_name  @Model.last_name
            </td>
        </tr>
        <tr>
         <td colspan="2" >
            @Html.Partial("_DegreeDetailsByGraduand", @Model.DegreeList)
         </td>
        </tr>

        <tr>
        <td colspan="2" >
        IS information is correct ?
        </tr>
        <tr>
        <td>
         <input type="submit" id="btndegreeconfirmYes" name="btnsearch" class="searchbutton"  value="Yes" />    
         </td>  <td>
          <input type="submit" id="btndegreeconfirmNo" name="btnsearch" class="searchbutton"  value="No" /></td>  
        </tr>
</table>


 }

这是我的控制器。
[HttpPost]

        public ActionResult CheckData()
        {

            return RedirectToRoute("detailform");
        }

我不知道如何在控制器中获取按钮的值。 我该怎么做?
6个回答

9
给您的提交按钮命名,然后在控制器方法中检查提交的值:
<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" name="submitButton" value="Send" />
<input type="submit" name="submitButton" value="Cancel" />
<% Html.EndForm(); %>



public class MyController : Controller {
    public ActionResult MyAction(string submitButton) {
        switch(submitButton) {
            case "Send":
                // delegate sending to another controller action

            case "Cancel":
                // call another action to perform the cancellation

            default:
                // If they've submitted the form without a submitButton, 
                // just return the view again.
                return(View());
        }
    }

希望这能帮到您:

}


3

我想你正在使用MVC + Razor引擎。

要做到这一点:

你的两个按钮:

<input type="submit" value="Yes" id="buttonYes"/>
<input type="submit" value="Cancel" id="buttonCancel"/>

您的表单:

@using (Html.BeginForm("Method", "Controller", FormMethod.Post, new { enctype = "multipart/form-data", id = "CreateReportForm" }))
{ 
…
}

将此 JavaScript 添加到您的表单中。将您的 action 改为控制器上的 action,以便进行重定向:
<script type="text/javascript">

    $(document).ready(function () {
        $("#buttonYes").click(function () {
            $('form#CreateReportForm').attr({ action: "Controller/Create" });
        });
        $("#buttonCancel").click(function () {
            $('form#CreateReportForm').attr({ action: " Controller /Cancel" });
        });
    });

</script>

1
你实际上不需要使用 JavaScript 来完成这个。 - Darin Dimitrov

2
尝试像这样做:

像这样尝试:

[HttpPost]
public ActionResult CheckData(string btnSearch)
{
    if (btnSearch == "Yes") {
        // The Yes submit button was clicked
    } else if (btnSearch == "No") {
        // The No submit button was clicked
    }
    return RedirectToRoute("detailform");
}

但通常最好不要根据按钮的文本进行测试,而是根据预定义的值进行测试,因为文本可能会更改,您的控制器操作可能会出错:

<button type="submit" name="btnsearch" value="yes">Yeah</button>
<button type="submit" name="btnsearch" value="no">Nope, I don't want to do this</button>

然后:

[HttpPost]
public ActionResult CheckData(string btnSearch)
{
    if (btnSearch == "yes") {
        // The Yes submit button was clicked
    } else if (btnSearch == "no") {
        // The No submit button was clicked
    }
    return RedirectToRoute("detailform");
}

甚至有更好的方法,您可以根据所点击的按钮将其分派到不同的控制器操作。 请查看 此文章

您可以拥有一个表单,其操作等于Action

@using (Html.BeginForm("Action", "Post")) 
{
  <input type="submit" name="saveDraft" value="Save Draft" />
  <input type="submit" name="publish" value="Publish" />
}

接下来在相应的控制器中有两个控制器动作:

public class PostController : Controller 
{
    [HttpParamAction]
    [HttpPost]
    public ActionResult SaveDraft(...) 
    {
        // ...
    }

    [HttpParamAction]
    [HttpPost]
    public ActionResult Publish(...) 
    {
        // ...
    }
}

以下是自定义操作名称选择器的定义:

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

现在,根据点击的提交按钮,将调用相应的控制器操作。

值得注意的是,如果您想使用单个控制器操作来处理此操作,但希望减少魔术字符串的使用,那么一个基于视图的枚举可以作为控制器解释值的良好修改方式! - daniel.caspers

1
请使用FormValueRequired属性,像这样:
[HttpPost]
[FormValueRequired("btndegreeconfirmYes")]        
     public ActionResult CheckData()
     {
       Response.Write(submit);                    
       return RedirectToRoute("detailform");
     }

您需要按照以下方式更改您的标记:

编辑:使用两个嵌套表单

    @using (Html.BeginForm())
    {
      @using (Html.BeginForm())
       {
           .
           .
           .       
      <input type="submit" id="btndegreeconfirmYes" name="btndegreeconfirmYes"class="searchbutton" value="Yes" />           
       }
<input type="submit" id="btndegreeconfirmNo" name="btndegreeconfirmNo"    class="searchbutton"  value="No" /></td>
    }

通过这样做,使用第一个提交按钮提交表单将只发送其自己的值,然后您可以在FromValueRquired属性中使用它。


0

您可以创建一个处理程序,以便您的控制器可以根据submit元素名称路由您的post。

http://stevenbey.com/enable-multiple-submit-buttons-in-aspnet-mvc

例如,控制器可以像这样处理名称为“Action_Publish”的提交元素:
[HttpPost, FormAction(Prefix = "Action_")]    
public ActionResult Publish()    
{        
//...  
}

0
通常我会使用被接受的答案,但是当你已经在传递一个模型时,它似乎不起作用。而且将其添加为模型属性似乎也行不通。
以下是另一种简单的解决方案,适用于传递模型的情况:
  • 在您的模型中添加一个SubmitButton属性

  • 添加一个隐藏的输入框,名称和ID为SubmitButton

  • 在提交按钮上使用onclick来设置隐藏输入框的值

    <input type="hidden" id="SubmitButton" name="SubmitButton" value="save" />
    
    <input type="submit" value="Clear" onclick="$('#SubmitButton').val('clear');" />
    <input type="submit" value="Save" />
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接