经过多年的asp.net,我终于尝试并尝试学习MVC 我习惯使用asp.net AJAX PageMethods,你可以将一个自动解析的对象传递给该方法中参数的任何类型。
使用Javascript:
PageMethods.AddPerson({First:"John",Last:"Doe"});
代码隐藏:
[WebMethod]
public static Result AddPerson(Person objPerson)
{
return Person.Save();
}
如何使用MVC和jQuery呢? 是否必须发送字符串并将json解析为对象?
答案 0 :(得分:4)
这取决于您的表单数据的复杂程度。让我们使用一个jQuery示例:
$.ajax({
url: '\Persons\AddPerson', // PersonsController, AddPerson Action
data: { First: "John", Last: "Doe" },
type: 'POST',
success: function(data, status)
{
alert('Method called successfully!');
}
});
所以我们发布了两个数据。如果Person类有两个名为'First'和'Last'的属性,那么默认的ASP.NET MVC Model Binder应该没有问题将这个表单数据放入这些属性中(其他一切都将被默认)。
当然,您总是可以为Person类型创建一个自定义模型绑定器,然后您可以获取所需的任何表单值,并将它们放入任何属性中,或者调用其他类型的逻辑。
答案 1 :(得分:2)
我有一篇文章介绍了对ASP.NET MVC操作方法的AJAX调用。它涵盖以下组合:
答案 2 :(得分:0)
当您通过ajax将表单发布到控制器上的操作方法时,ModelBinder体系结构会将所发布的表单值解析为业务对象。您可以通过几种不同的方式利用模型绑定。
public ActionResult MyAction(MyObject obj)
{
}
在上面的示例中,modelbinder隐式尝试根据请求中收到的信息创建MyObject
。
public ActionResult MyAction(FormCollection stuff)
{
MyObject obj = new MyObject();
TryUpdateModel(obj);
}
这里我们明确地尝试将发布的表单数据绑定到我们创建的对象。 ModelBinder将尝试将发布的值与对象的属性进行匹配。
在上述任何一种情况下,您都可以查询ModelState
对象,以查看在将过帐值转换为对象期间是否发生任何错误。
有关模型绑定的介绍,see here。
对于列表和词典的高级模型绑定,see Phil Haack's post。
答案 3 :(得分:0)
你可以这样做:
var person = {};
person["First"] = $("#FirstName").val();
person["Last"] = $("#LastName").val();
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "/Admin/AddPerson",
data: JSON.stringify(person),
dataType: "json",
success: function(result) {
},
error: function(result) {
}
});
然后在您的管理员控制器上:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddRelease(Person p)
{
// Code to add person
}
JSON.stringify方法可从here获得。您也可以使用模型而不是Person对象作为参数,以便您可以处理所有验证。
答案 4 :(得分:0)
我想我是骗子,并做以下事情:
$("#ProgressDialog").dialog({
autoOpen: false,
draggable: false,
modal: true,
resizable: false,
title: "Loading",
closeOnEscape: false//,
// open: function () { $(".ui-dialog-titlebar-close").hide(); } // Hide close button
});
$("form").live("submit", function (event) {
event.preventDefault();
var form = $(this);
$("#ProgressDialog").dialog("open");
$.ajax({
url: form.attr('action'),
type: "POST",
data: form.serialize(),//USE THIS to autoserialize!
success: function (data) {
$("#dialog").dialog({height:0});
},
error: function (jqXhr, textStatus, errorThrown) {
alert("Error '" + jqXhr.status + "' (textStatus: '" + textStatus + "', errorThrown: '" + errorThrown + "')");
},
complete: function () {
$("#ProgressDialog").dialog("close");
}
});
});
});
<div id="ProgressDialog" style="text-align: center; padding: 50px;">
<img src="@Url.Content("~/Content/ajax-loader.gif")" width="128" height="15" alt="Loading" />
</div>