ASP.NET MVC:使用Ajax.BeginForm实现多个提交按钮

13

我想创建一个网页,其中有一个“下一页”和“上一页”的按钮,可以切换显示的图像。

为此,我创建了一个 Ajax.BeginForm 并在其中插入一张图片和两个提交按钮。

我可以(应该)在 Ajax.BeginForm 中使用多个提交按钮吗?

控制器如何单独处理每个提交?

3个回答

28

试试这个,

查看

@model TwoModelInSinglePageModel.RegisterModel
@using (Ajax.BeginForm("DYmanicControllerPage", "Test", FormMethod.Post,null, new { id = "frmSignUp" }))
{ 
  <div>
                <input type="hidden" id="" name="hidden2" id="hdasd" />
                @Html.HiddenFor(m => m.hidden1)
                @Html.LabelFor(m => m.Name)
                @Html.TextBoxFor(m => m.Name)
                @Html.ValidationMessageFor(m => m.Name)
            </div>
            <br />
            <div>
                @Html.LabelFor(m => m.Address)
                @Html.TextBoxFor(m => m.Address)
                @Html.ValidationMessageFor(m => m.Address)
            </div>
            <br />
            <div>
                @Html.LabelFor(m => m.PhoneNo)
                @Html.TextBoxFor(m => m.PhoneNo)
                @Html.ValidationMessageFor(m => m.PhoneNo)
            </div>

 <input type="submit" value="Save"  id="btnSave" name="ButtonType"/>
 <input type="submit" value="Next"  id="btnNext" name="ButtonType" />


}

控制器

  [HttpPost]
        public ActionResult DYmanicControllerPage(RegisterModel model,  string ButtonType)
        {
        if(ButtonType == "Next")
        {
            // Do Next Here
        }
        if (ButtonType == "Save")
        {
            //Do save here
        }
        return JavaScript("REturn anything()");

        }

这个动作得到的模型没有保留页面上的值,这是自然的吗? - kroiz
@kroiz 抱歉,我不明白你想说什么。你能发一些代码让我帮你吗? - Jaimin
谢谢,但这不是适当的地方,我会发起一个新的问题。只告诉我这个问题:在上面的操作“DYmanicControllerPage”中,“RegisterModel model”模型,它是否应该拥有来自表单的名称、地址和电话号码等数据? - kroiz
@kroiz 是的,你可以在视图页面中使用 @model TwoModelInSinglePageModel.RegisterModel 获取 RegisterModel 中的数据。我刚刚更新了我的帖子。 - Jaimin
如果您的按钮中有图片或者按钮被翻译了,这会如何工作? - Roger Far
显示剩余2条评论

7
我建议你使用两个按钮,并根据点击哪个按钮设置表单的操作: Razor
$(function (){
    $("#btn-prev").click(function() {
        $("#form").attr
                   (
                      "action",
                      "@Url.Action("Action", "Controller", new {area="Area" })", 
                   ).submit();
    });
    $("#btn-next").click(function() {
        $("#form").attr
                   (
                      "action",
                      "@Url.Action("Action", "Controller", new {area="Area" })", 
                   ).submit();
    });
});

我在这里使用jQuery来实现这个功能,但我认为你可以理解这个想法。

你能详细说明一下控制器中的操作吗?我应该只有一个操作吗?如果是这样,我如何区分上一个和下一个?另外,什么是操作URL?谢谢。 - kroiz
动作是表单提交的 URL。如果您即时修改它,可以更改表单将要提交到的位置。您只需要拥有一个 Ajax.BeginForm 即可。它会在客户端上输出 form 标记,您可以通过 JavaScript 进行更改。 - Sam
使用了上述代码,但我无法到达action。我编写Ajax.BeginForm的方式是否有关系?我需要控件中操作的特殊签名吗?我调用了 @using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId = "result" })). - kroiz

1
我有同样的需求/问题,尝试了这两个解决方案,它们都对我有效。我喜欢通过点击时使用jquery设置操作的想法,这样我就可以保持我的操作分离,以便其他视图可以使用。
然而,我发现当我在调试时这样做时,它会发布两次,并且 BOTH OnSuccess 和 OnFailure 都会触发。只有在调试时才会发生这种情况。在选择时请记住这一点。

只是提醒一下:这种情况通常发生,不仅在调试时。我有一个txt文件,每次执行我的操作时都会记录时间戳。无论是否进行调试,当我通过jquery设置表单的操作时,都会写入两行...但是当操作被硬编码时,只会写入一行。在我找出原因之前,这可能不是一种安全的方法。 - citronsmurf
此外...我发现了很多关于Ajax.Beginform双重提交的文章。它们全部都与人们意外两次添加了不显眼的javascript JS文件有关(一次在部分视图中,一次在主布局中)。但这并不是我的情况。所以我不知道为什么会发生这种情况。我会继续研究,因为我真的希望jquery方法能够起作用。 - citronsmurf

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