我有一个简单的表单,用于更新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字段?或者我只是这样做错了?
答案 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 })%>
<% } %>