Html.BeginForm中的Ajax.BeginForm

时间:2009-04-24 14:20:18

标签: c# asp.net-mvc asp.net-ajax

我有一个用于编辑内容的视图,比如订单。订单包含可以任意添加的订单项。所以主视图和嵌套的偏见视图。

每个部分应该有一个ajax表单,用于调整每个订单项的数量或其他任何内容。

因此:

Html.BeginForm()
{%>
    Ship to: blah blah blah  
    <%
    Ajax.BeginForm("EditLineItem", "Order", new { OrderLineItemID = Model.ObjectID }, itemAjaxOptions))
    {
        Item qty blah blah blah

        <--! (ajax form's submit button, etc.)-->
    }
    %>
    <--! (ajax form's submit button, etc.)-->
<%
}

我有一个看起来像这样的控制器:

[ActionName("Edit")]
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult Edit(int orderID)
{
    blah, blah
}

[ActionName("EditLineItem")]
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult EditLineItem(Guid orderLineItemID)
{
    blah, blah
}

我的麻烦是,当我提交Ajax表单时,我得到Edit方法而不是EditLineItem方法。两个路由都已映射。是否有一些问题,比如“你不能在Html表单中提交Ajax表单”,我不知道?

2 个答案:

答案 0 :(得分:12)

我刚才尝试过同样的事情。无论我做了什么,都不会提交AJAX。所以我认为答案是:是的,你不能在常规的html表单中放置一个AJAX表单的提交按钮。

但是,为什么你会将部分提交与完整提交合并? 这个imo最简单的解决方法是使用jQuery的JSON请求。

例如,更改下拉列表时更新数量范围文本(id = Order):

<script type="text/javascript">
    $(document).ready(function() {
        $('select#Order').change(function() {
            $.getJSON('/Orders/UpdateQty/' + this.value, {},
              function(data) {
                  $('#qty').html(data);
              });
        });
    });

</script>

“订单”控制器中的代码:

public class OrdersController : Controller
{
    public ActionResult UpdateQty(int id)
    {
        return Json(yourLibrary.getQuantities(id));
    }
}

Link可能有所帮助。 此致

修改

所以..链接不再存在。但是由于互联网的备用机器,我们有this copy:)

答案 1 :(得分:2)

AFAIA AjaxForm仍然作为表单标记呈现,所以你要嵌套表单,正如你所发现的那样是不行的。

我认为弗朗西斯科是在正确的路线上(因为我建议你实施一个帖子而不是获取更新的东西)。

亲切的问候, TP