如何将复杂对象从jquery传递到标记
中的动作控制器我有像这样的jquery代码
function InitCell(row, column, value) {
var MyPerson = new Object();
MyPerson.ID = '123456789';
MyPerson.FirstNmae = 'abc';
MyPerson.LastName = 'def';
var html = "<a href='/test/Index/person =" + MyPerson +"></a>";
}
另外我有一个像这样的动作控制器
public class testController : Controller
{
//
// GET: /test/
public ActionResult Index(Person person)
{
return View();
}
}
class Person
{
public int ID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public List<Person> Children { get; set; }
}
答案 0 :(得分:3)
您可以做的是提出HTTP POST
请求,而不是HTTP GET
。
$('#postLink').click(function() {
var MyPerson = {
ID: 1234,
FirstName: 'abc',
LastName: 'def'
};
$.ajax({
data: MyPerson,
url: $(this).attr('href'),
type: 'POST',
dataType: 'json' /* this really is optional */,
success: function (response) {
return true;
},
error: function ( error ) {
return false;
}
)};
return false; /* required to stop event propagation */
});
现在您可以定义HTML <a>
元素,如下所示:
<a href="/test/Index" id="postLink">Ajax post the person to the server.</a>
您的控制器现在应该能够解析Person
对象。
修改:如果您没有随每个请求传递List<Person>
,则可能需要删除Person
。它将帮助ASP.NET识别复杂类型(在本例中为class PersonViewModel
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
)作为请求的数据类型。通常最好为每个视图创建ViewModel,以便为视图提供强类型的数据上下文。
{{1}}
答案 1 :(得分:0)
你不能这样。 URI是字符串。如果要在其中传递未格式化为字符串的数据,则必须将其序列化为字符串,然后在另一端进行反序列化。
出于一般目的,JSON是一种流行的序列化格式,但请记住并非所有字符串都是URI安全的,因此在将其包含在URI中之前,您需要encode the JSON text。
你只有三条数据,所以你可以:
var html = "<a href='/test/Index/person/" +
encodeURIComponent( MyPerson.ID ) + "/" +
encodeURIComponent( MyPerson.FirstName ) + "/" +
encodeURIComponent( MyPerson.LastName ) +
"></a>";
或者,如果数据已存在于服务器上 - 只需传递ID值,然后从数据库中获取名称。
答案 2 :(得分:0)
查询字符串接受的参数不是您拥有的对象类型,因此您必须将其作为带有分隔符的&amp;的查询字符串传递。
示例:
var html = "<a href='/test/Index/person?PersonId=123456789&FirtsName=Test......