如何将复杂对象从jquery传递到标记<a></a>中的动作控制器

时间:2012-08-04 23:18:23

标签: c# javascript jquery asp.net-mvc-3 controller

如何将复杂对象从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; }
}

3 个答案:

答案 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......