Asp.net mvc 根据单击的提交按钮,将表单发布到不同的MVC post操作

Asp.net mvc 根据单击的提交按钮,将表单发布到不同的MVC post操作,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我使用的是ASP.NETMVC4。我在一个视图上有多个按钮。。目前我正在调用相同的操作方法;我使用名称属性来区分单击的按钮 @using (Html.BeginForm("Submit", "SearchDisplay", new { id = Model == null ? Guid.NewGuid().ToString() : Model.SavedSearch }, FormMethod.Post)) { <div class="leftSideDiv">

我使用的是
ASP.NETMVC4
。我在一个视图上有多个按钮。。目前我正在调用相同的操作方法;我使用
名称
属性来区分单击的按钮

@using (Html.BeginForm("Submit", "SearchDisplay", new { id = Model == null ? Guid.NewGuid().ToString() : Model.SavedSearch }, FormMethod.Post))
{
    <div class="leftSideDiv">
        <input type="submit" id="btnExport" class="exporttoexcelButton" 
        name="Command" value="Export to Excel" />
    </div>

    <div class="pageWrapperForSearchSubmit">
        <input type="submit" class="submitButton" 
         value="Submit" id="btnSubmitChange" />
    </div>
}
问题

  • 是否有一种方法可以在不同的按钮点击时直接使用不同的POST操作方法(无需自定义路由)
  • 如果没有自定义路由是不行的,那么如何使用自定义路由呢
  • 参考文献:


  • 您可以使用ajax调用调用不同的方法,而无需回发

    $.ajax({
        type: "POST",
         url: "@(Url.Action("Action", "Controller"))",
         data: {id: 'id', id1: 'id1' },
         contentType: "application/json; charset=utf-8",
         cache: false,
         async: true,
         success: function (result) {
            //do something
         }
    });
    

    对我来说,这听起来像是一个有两个输出的命令,我会选择在客户端和服务器中对此进行更改

    在客户端,使用JS构建您想要发布到的URL(为了简单起见,使用JQuery),即

    您可以设置两个不同的操作

    public ActionResult SubmitExcel(SearchCostPage model)
    {
       ...
    }
    
    public ActionResult Submit(SearchCostPage model)
    {
       ...
    }
    
    或者您可以使用
    ActionName
    属性作为别名

    public ActionResult Submit(SearchCostPage model)
    {
       ...
    }
    
    [ActionName("SubmitExcel")]
    public ActionResult Submit(SearchCostPage model)
    {
       ...
    }
    

    您可以根据浏览器支持的不同,以不同的方式选择必须发布表单的url(从而选择调用的操作):

    • 对于支持HTML5的较新浏览器,您可以使用
    • 对于不支持此功能的旧浏览器,您需要在单击按钮时以及提交之前使用一些JavaScript来更改
    这样,您就不需要在服务器端执行任何特殊操作

    当然,您可以在Razor中使用
    Url
    extensions方法来指定表单操作

    对于支持HMTL5的浏览器:只需如下定义提交按钮:

    <input type='submit' value='...' formaction='@Url.Action(...)' />
    
    <input type='submit' data-form-action='@Url.Action(...)' value='...'/>
    
    注意:此脚本将处理页面中具有
    type=submit
    数据表单操作
    属性的任何元素的单击。当发生这种情况时,它将获取
    数据表单操作
    属性的值,并将包含表单的操作设置为该属性的值。由于它是一个委托事件,因此它甚至可以用于使用AJAX加载的HTML,而无需采取额外的步骤

    然后,您只需将带有所需操作URL的
    数据表单操作
    属性添加到按钮,如下所示:

    <input type='submit' value='...' formaction='@Url.Action(...)' />
    
    <input type='submit' data-form-action='@Url.Action(...)' value='...'/>
    
    
    
    请注意,单击按钮会更改表单的操作,然后浏览器会将表单发布到所需的操作


    如您所见,这不需要自定义路由,您可以使用标准的
    Url
    扩展方法,在现代浏览器中也没有什么特别的事情可做。

    最佳答案1:

    中提到的ActionNameSelectorAttribute

  • 答案2

    参考:

    第二种方法

    添加用于处理“取消”按钮单击的新表单。现在,单击“取消”按钮,我们将发布第二个表单并重定向到主页

    第三种方法:客户端脚本

    <button name="ClientCancel" type="button" 
        onclick=" document.location.href = $('#cancelUrl').attr('href');">Cancel (Client Side)
    </button>
    <a id="cancelUrl" href="@Html.AttributeEncode(Url.Action("Index", "Home"))" 
    style="display:none;"></a>
    
    取消(客户端)
    
    我需要一个完整的回复JS将允许您预处理您的提交请求,但这并不意味着您仍然无法获得完整的回复。我已经发布了一个答案。我编辑了您的问题标题以使其更准确,并添加了一个简单、有效的答案(在我的一些项目中进行生产).为什么不按多重提交按钮呢?a la可能会有帮助。恐怕不行。这是我自己做的。请尝试一下,如果您有任何疑问,请写一篇评论,我将帮助您改进我的答案。虽然我认为这个工具包非常清晰,你们很快就会使用它。你们能同时使用这两种方法来支持多个浏览器吗?或者您必须选择其中一个?JavaScript解决方案支持旧浏览器和新浏览器,前提是JavaScript未被禁用。同时使用这两种技术(这是可能的)还将涵盖禁用JavaScript的HTML5兼容浏览器的情况。
    <input type='submit' data-form-action='@Url.Action(...)' value='...'/>
    
    <button name="ClientCancel" type="button" 
        onclick=" document.location.href = $('#cancelUrl').attr('href');">Cancel (Client Side)
    </button>
    <a id="cancelUrl" href="@Html.AttributeEncode(Url.Action("Index", "Home"))" 
    style="display:none;"></a>