使用ASP.NET和MVC将表单提交给正确的操作

时间:2009-03-27 05:23:34

标签: jquery asp.net-mvc

我有一个简单的表单,用于更新ASP.NET MVC应用程序中的实体。我希望用户能够提交表单,在我的控制器上调用适当的Action,然后通知用户更新已完成。

因为我想在用户单击更新按钮后显示JQuery对话框,所以我想使用JQuery提交表单。但是,我的问题是:

虽然我可以很容易地让JQuery在我的控制器上调用一个动作,但我无法通过调用我已经在我的路线中设置的动作来调用[Authorize]和{{{ 1}}

例如,如果用户正在以下URL更新其实体:

[AcceptVerbs(HttpVerbs.Post)]

当JQuery提交表单时,我想将其提交给已装饰的编辑操作并接受ID作为参数。

我用来发布表单的JQuery如下:

/SomeController/Edit/5

如果我按如下方式定义表单:

$("#formFoo").submit(function() {
                var frm = $("#formFoo");
                var action = frm.attr("action");
                var serializedForm = frm.serialize();
                $.post(action, serializedForm, function() {
                    alert('Call completed');
                });
                return false;
            });

和我的行动如下:

<form id="formFoo" action="/SomeController/SomeOtherAction" method="post">

然后我的动作被调用,我的对象被正确填充,但它的ID字段没有填充,所以我不知道我正在更新什么实体。

如果我将表单更改为:

public void SomeOtherAction() 
{
    var myEntity=new MyEntity();
    UpdateModel(myEntity);
}

我的编辑操作定义为:

<form id="formFoo" action="/SomeController/Edit" method="post">

然后我的动作似乎永远不会被JQuery调用。

我想我可以以某种方式将ID参数从查询字符串中拉出来并将其填入我发布回表单的数据中,但这看起来非常难看。或者有没有办法在我的SomeOtherAction动作中获取ID字段?或者我只是这样做错了?

2 个答案:

答案 0 :(得分:3)

致电时:

$.post(action

然后“action”参数需要包含ID。在你的问题中,你没有说明它在运行时是什么,但我强烈怀疑它不包括ID。根据您的“编辑”操作的示例URI,ID应位于URI的路径中,而不是在查询中。使用默认的MVC路由它不应该有任何区别,但不知道你的路由是什么我会说你应该密切关注你在问题中给出的URI格式。

所以安装firebug,如果你还没有,在JavaScript中放置一个断点,并检查action参数的值。

如果看起来仍然正确,请打开Firebug的Net面板,单击XHR选项,然后查看代码生成的实际URI。确保它是正确的。如果URI不正确,请查看您的路由并确保将此URI正确路由到正确的操作。

最后,但我在jQuery Ajax Form plug-in的插件中。我发现它使这种事情变得非常容易。

答案 1 :(得分:1)

您有两种方法可以做到这一点。

您可以使用FormCollection或使用实体。

FormCollection示例:

  • 控制器

    public ActionResult ProductEditHandle(int? productID, FormCollection formCollection)
    {
        Product product = null;
    
    if (productID.HasValue)
        product = ProductEditUpdateModel(productID.Value, formCollection);
    
    return View("ProductEdit", product);
    }
    
  • 查看

    <% using (Html.BeginForm("ProductEditHandle", "Product", new { productID = 5 })) { %>
    ......
    <% } %>
    

带有实体的样本:

  • 控制器

    public ActionResult AddressTypeHandler(AddressTypeDto addressTypeDto)
    {
        var addressType = addressTypeDto.AddressTypeId > 0 ? _addressService.UpdateAddressType(addressTypeDto) : _addressService.CreateAddressType(addressTypeDto);
    
    return RedirectToAction("AddressTypeEdit", new { addressTypeId = addressType.AddressTypeId });
    }
    
  • 视图(使用ViewPage声明的视图 - AddressTypeDto)

    <% using (Html.BeginForm("AddressTypeHandler", "People")) { %>
    
    <%= Html.Hidden("AddressTypeDto.AddressTypeId", (ViewData.Model != null) ? ViewData.Model.AddressTypeId : 0) %>
    <%=Html.TextBox("AddressTypeDto.Name", ViewData.Model != null ? ViewData.Model.Name : string.Empty, new { size = 50 })%>
    <% } %>